如果我像这样制作一个JFrame
public static void main(String[] args) {
new JFrame().setVisible(true);
}
然后在关闭窗口后,appication不会停止(我需要杀死它)。
显示应用程序主窗口的正确方法是什么?
我也想知道提出解决方案的原因。
提前致谢。
答案 0 :(得分:20)
您应该在JFrame中调用setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
。
示例代码:
public static void main(String[] args) {
Runnable guiCreator = new Runnable() {
public void run() {
JFrame fenster = new JFrame("Hallo Welt mit Swing");
fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fenster.setVisible(true);
}
};
SwingUtilities.invokeLater(guiCreator);
}
答案 1 :(得分:3)
应用程序窗口和应用程序本身之间存在差异...窗口在其自己的线程中运行,如果其他线程仍处于活动状态,则完成main()
将不会结束应用程序。关闭窗口时,您还应确保关闭应用程序,可能需要调用System.exit(0);
Yuval = 8 - )
答案 2 :(得分:3)
您必须处理框架,在窗口侦听器中调用dispose方法或使用setDefaultCloseOperation。对于最后一个的参数,您可以使用两个选项:
DISPOSE_ON_CLOSE
或EXIT_ON_CLOSE
。
DISPOSE_ON_CLOSE
仅处理帧资源。
EXIT_ON_CLOSE
处理帧资源,然后调用System.exit
。
除非你有非守护程序线程,否则它们之间没有真正的区别。
我更喜欢使用DISPOSE_ON_CLOSE
,因为这样我就能注意到我是否忘记终止一个线程,因为如果没有更多线程在运行,JVM将会停止。这也是因为在没有处理的情况下关闭Frame将不会终止应用程序的原因,因为Swing创建了一个线程来处理仅在调用dispose时终止的事件。
答案 3 :(得分:0)
您可以将窗口侦听器设置为框架,以便程序在关闭后终止。
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
答案 4 :(得分:0)
执行此操作的正确方法(除非您正在编写一个非常简单的单窗口应用程序,即没有其他窗口或线程等...)是捕获windowClosing()
事件,然后调用{{ 1}}形式的方法。
如果您的程序在此之后没有完全退出,则意味着您正在运行其他非deamon线程,并且必须根据您的程序以您认为合适的方式停止这些线程。
调用dispose();
或System.exit()
将强制停止任何其他线程(以及整个程序),这意味着您的代码不太可移植,并且强制停止线程显然是危险的(以编程方式)。