清除JFrame的组件并添加新组件 [英] Clear components of JFrame and add new components

查看:164
本文介绍了清除JFrame的组件并添加新组件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 JFrame ,它有一些选项。当按下确定按钮时,我想要相同的 JFrame 来清除内容并添加新内容。我试过了,但问题是新的 JFrame 被弹出。我做错了什么?

I have a JFrame, which have some options. When OK button is pressed i want the same JFrame to clear the contents and add new contents. I have tried it but the problem is new JFrame is popped out. What am I doing wrong?

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;

public class GuiFrame extends JFrame {

    final JFrame f = new JFrame("Test");

    public void Starter(){
        ImageIcon img = new ImageIcon("C:\\Users\\neal\\Desktop\\no.png");
        f.setIconImage(img.getImage());
        ButtonGroup group = new ButtonGroup();
        final JRadioButton Acess = new JRadioButton("Acess");
        final JRadioButton Chat = new JRadioButton("Chat");
        group.add(Acess);
        group.add(Chat);
        f.setSize(400,100);
        f.setLocationRelativeTo(null);
        JButton OptionOk = new JButton("OK");

Label option = new Label("Choose a Option");

        final Container content = f.getContentPane();
        content.setBackground(Color.white);
        content.setLayout(new FlowLayout());

        content.add(option);
        content.add(Acess);
        content.add(Chat);
        content.add(OptionOk);
          f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

              OptionOk.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {


                try {
                    new GuiFrame().Initiate();
                } catch (UnknownHostException ex) {
                    Logger.getLogger(GuiFrame.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
              });
    }

    public void Initiate() throws UnknownHostException {

        f.removeAll();
        ButtonGroup group = new ButtonGroup();

        final JRadioButton ButtonServer = new JRadioButton("Server");
        final JRadioButton ButtonClient = new JRadioButton("Client");
        group.add(ButtonServer);
        group.add(ButtonClient);

        f.setSize(400, 100);
        f.setLocationRelativeTo(null);
        InetAddress thisIp = InetAddress.getLocalHost();

        ImageIcon img = new ImageIcon("C:\\Users\\neal\\Desktop\\no.png");
        f.setIconImage(img.getImage());
        Label lip = new Label("Your IP is : " + thisIp.getHostAddress());
        Label setup = new Label("Setup as ");
        JButton ButtonOk = new JButton("OK");

        final Container content = f.getContentPane();
        content.setBackground(Color.white);
        content.setLayout(new FlowLayout());
        content.add(lip);
        content.add(setup);
        content.add(ButtonServer);
        content.add(ButtonClient);
        content.add(ButtonOk);
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) throws UnknownHostException {

        GuiFrame gf = new GuiFrame();
        gf.Starter();
    }
}


推荐答案

解决方案很简单:使用CardLayout让这个布局管理器为您完成所有繁重的工作。有关如何执行此操作的详细信息,请参阅教程:如何使用CardLayout

The solution is simple: use a CardLayout and let this layout manager do all the heavy lifting for you. For more details on how to do this, please see the tutorial: How to use CardLayout

至于你的代码,请注意你实际上在创建2个JFrame时会创建2个JFrame,如果按下JButton则会再创建两个JFrame:

As for your code, please note that you are actually creating 2 JFrames when it starts and two more if the JButton is pushed:

GuiFrame类本身扩展了JFrame,但它似乎是一个你永远不会使用的JFrame,因此被浪费了,但它仍然是在程序启动时创建的,每当创建GuiFrame实例时,例如按下按钮时。然后在这个类的内部创建另一个JFrame f,一个在程序启动时再次按下按钮,我不认为这是你想要做的。

The GuiFrame class itself extends JFrame, but it appears to be a JFrame that you never use and thus is wasted, but it is created nonetheless on program start up and whenever GuiFrame instance is created, such as when the button is pressed. Then inside of this class you create another JFrame f, one on program start up and once again on button press, and I don't think that this is what you want to do.

因此,更改代码以使类不扩展JFrame,并且不要在按钮的ActionListener中创建类的新实例。而是使用CardLayout交换视图。

So change your code so that the class does not extend JFrame, and don't create a new instance of the class in your buttons' ActionListener. Instead use a CardLayout to swap views.

例如:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class GuiFrame {

   private static final String FIRST_PANEL = "First Panel";
   private static final String SECOND_PANEL = "Second Panel";
   final JFrame f = new JFrame("Test");
   private CardLayout cardLayout = new CardLayout();
   private JPanel content;

   public void Starter() {
      f.setSize(400, 100);
      f.setLocationRelativeTo(null);
      JButton OptionOk = new JButton("OK");

      Label option = new Label("Choose a Option");

      content = (JPanel) f.getContentPane();
      content.setLayout(cardLayout);

      JPanel firstPanel = new JPanel();
      firstPanel.setBackground(Color.white);
      firstPanel.setLayout(new FlowLayout());

      firstPanel.add(option);
      firstPanel.add(OptionOk);

      content.add(firstPanel, FIRST_PANEL);
      content.add(createSecondPanel(), SECOND_PANEL);
      f.setVisible(true);
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      OptionOk.addActionListener(new ActionListener() {

         public void actionPerformed(ActionEvent e) {

            cardLayout.show(content, SECOND_PANEL);

         }
      });

   }

   private JPanel createSecondPanel() {
      JPanel secondPanel = new JPanel();
      secondPanel.add(new JButton(new AbstractAction("Go Back") {
         public void actionPerformed(ActionEvent e) {
            cardLayout.show(content, FIRST_PANEL);
         }
      }));
      return secondPanel;
   }


   public static void main(String[] args) {

      GuiFrame gf = new GuiFrame();
      gf.Starter();
   }

}

这篇关于清除JFrame的组件并添加新组件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆