我有一个JFrame和一个Button,它打开了一个不同的JFrame。但我希望按钮只打开第二帧一次。问题是,每次我点击它,我都会得到一个新的框架示例。这一定是一个非常常见的问题,因为我正在阅读一本关于如何创建此GUI的书。我觉得很奇怪,作者没有提到这个“功能”。那么,如何防止按钮打开新框架的多个副本?
JFrame
Button
hk8txs481#
不要让按钮每次都创建一个新的JFrame,而是让第二个JFrame成为第一个JFrame的成员,并且只让按钮调用jframe2.setVisible(true);:
jframe2.setVisible(true);
class JFrame1 { JFrame2 jframe2=...; JButton button=...; JFrame1() { ... button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { jframe2.setVisible(true); } }); ... } }
字符串
5rgfhyps2#
更新!试试这个:
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);希望这对你有帮助。
JFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
vhipe2zx3#
您应该保留对第一次打开的子帧的引用。在第二次你首先检查你是否有一个参考或没有,然后决定创建一个新的框架或把重点放在现有的开放框架。
作为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关闭子框架。
WindowAdapter
mf98qq944#
请尝试以下代码片段:
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"); } });
frame2.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { // handle closing the window secondWindowIsOpne = false; frame2.setVisible(false); frame2.dispose(); } });
型
4条答案
按热度按时间hk8txs481#
不要让按钮每次都创建一个新的JFrame,而是让第二个JFrame成为第一个JFrame的成员,并且只让按钮调用
jframe2.setVisible(true);
:字符串
5rgfhyps2#
更新!
试试这个:
字符串
确保您正在手动处理所有JFrame的关闭,如下所示:
型
而不是使用
JFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
希望这对你有帮助。
vhipe2zx3#
您应该保留对第一次打开的子帧的引用。在第二次你首先检查你是否有一个参考或没有,然后决定创建一个新的框架或把重点放在现有的开放框架。
作为OP评论的回答的示例(类似于@AlexanderTorstling的其他回答,但不是立即创建子帧):
字符串
此示例的优点还在于,如果主框架已关闭,则可以通过注册的
WindowAdapter
关闭子框架。mf98qq944#
请尝试以下代码片段:
字符串
确保您正在手动处理所有JFrame的关闭,如下所示:
型