我有JFrame
Button
,可以打开不同的JFrame
。但我希望按钮只打开第二帧一次。问题是,每次我点击它,我得到一个新的框架实例。这个必须是一个非常常见的问题,因为我正在阅读一本关于如何创建此GUI的书。我觉得很奇怪,作者没有提到这个"功能"。
那么如何让我的按钮不打开新框架的多个副本?
答案 0 :(得分:2)
您应该首次参考您打开的子画面。在第二次,您首先检查您是否有参考,然后决定创建一个新框架或将焦点放在现有的开放框架上。
示例作为对OP的评论的回答(类似于@AlexanderTorstling的其他答案,但不是立即创建子框架):
class MainFrame extends JFrame {
private JFrame subFrame = null;
MainFrame() {
...
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (subFrame == null) {
subFrame = new JFrame();
...
}
subFrame.setVisible(true);
}
});
}
}
此示例还有一个优点,即如果主框架关闭,您可以通过已注册的WindowAdapter
关闭子框架。
答案 1 :(得分:2)
不是让按钮每次都创建一个新的JFrame,而是让第二个JFrame成为第一个JFrame的成员,只让按钮调用jframe2.setVisible(true);
:
class JFrame1 {
JFrame2 jframe2=...;
JButton button=...;
JFrame1() {
...
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
jframe2.setVisible(true);
}
});
...
}
}
答案 2 :(得分:2)
已更新!
试试这个:
JFrame frame2 = new JFrame(); // instance variable
...
//when button is clicked
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(!frame2.isVisible())
frame2.setVisible(true);
}
});
确保您正在处理所有JFrame的关闭,如下所示:
frame2.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
// handle closing the window
frame2.setVisible(false);
frame2.dispose();
}
});
而不是使用JFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
希望这会有所帮助。
答案 3 :(得分:0)
please try this one
JFrame frame2 = new JFrame(); // instance variable
boolean secondWindowIsOpne = false;
...
//when button is clicked
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(secondWindowIsOpne == false){
frame2.setVisible(true);
secondWindowIsOpne = true;
}
else{
System.out.println("This Window is already running");
}
});
make sure you are handling the closing of all of the JFrames manually like this:
frame2.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
// handle closing the window
secondWindowIsOpne = false;
frame2.setVisible(false);
frame2.dispose();
}
});