我有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 :(得分:5)
解决方案很简单:使用CardLayout让这个布局管理器为您完成所有繁重的工作。有关如何执行此操作的详细信息,请参阅教程:How to use CardLayout
至于你的代码,请注意你实际上在启动时创建2个JFrame,如果按下JButton则再创建两个JFrame:
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();
}
}
答案 1 :(得分: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();
}
}