Clear components of JFrame and add new components

2019-01-08 00:08发布

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();
    }
}

2条回答
【Aperson】
2楼-- · 2019-01-08 01:09

fixed (but still dirty) version:

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

public class GuiFrame implements ActionListener{

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

    public void start(){
        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(this);

    }

    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.removeAll();
        content.setBackground(Color.white);
        content.setLayout(new FlowLayout());
        content.add(lip);
        content.add(setup);
        content.add(ButtonServer);
        content.add(ButtonClient);
        content.add(ButtonOk);
        f.repaint();

    }

    public void actionPerformed(ActionEvent arg0) {
        try {
            initiate();
        } catch (UnknownHostException ex) {
            Logger.getLogger(GuiFrame.class.getName()).log(Level.SEVERE, null, ex);
        }       
    }

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

        GuiFrame gf = new GuiFrame();
        gf.start();
    }
}
查看更多
Bombasti
3楼-- · 2019-01-08 01:15

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

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

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.

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.

For example:

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();
   }

}
查看更多
登录 后发表回答