2011-11-06 62 views
2

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

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

请参阅例如在编辑 –

+0

有一些Java代码约定:先写变量和字段用小写字符,首先用大写写入类名。 Object obj = new Object(); – MartinL

回答

5

解决方案很简单:使用CardLayout并让这个布局管理器为您完成所有繁重工作。有关如何做到这一点的详细信息,请参见教程:How to use CardLayout

至于你的代码,请注意,您实际上是创建2个JFrames启动时,另外两个如果将JButton推:

的GuiFrame类本身扩展了JFrame,但它看起来像是一个你永远不会使用的JFrame,因此被浪费了,但是它在程序启动时以及每次创建GuiFrame实例时(例如按下按钮时)都会创建。然后在这个类的内部创建另一个JFrame f,一个用于程序启动,另一个用于按下按钮,我不认为这是你想要做的。

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

例如:

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

} 
+0

很好解释,CardLayout为+1。谢谢 – nebula

+0

不客气。祝你好运! –

0

固定的(但仍然脏)版本:

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

Opps !!没有工作! – nebula