我有一个带有菜单的java应用程序。其中一个菜单项是Exit
。其定义如下:
item_exit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
System.exit(0);
}
});
另一个菜单项是New
,它使同一程序的另一个实例(?)并行运行。它的定义如下:
item_new.addActionListener(new ActionListener() {
MyApp app = new MyApp();
app.start();
}
});
除了一个问题外,它可以按预期工作。当我关闭其中一个时,它们都关闭了。整个应用程序构建在一个JFrame对象上。我不认为更改它的默认关闭操作会有所帮助。我认为问题出在system.exit(0)
上。但是,解决这个问题的替代方法是什么?我只希望关闭的线程关闭,而不是全部关闭。感谢。
答案 0 :(得分:1)
创建一个对象并调用其start()
方法并不能使另一个程序并行运行。它只在同一个JVM中创建一个对象,并在同一个JVM中执行其start()
方法。
System.exit()
退出JVM,因此在此JVM中运行的所有内容都将停止运行。
要使JFrame不可见,请在其上调用setVisible(false)
。这不会阻止JVM。
答案 1 :(得分:0)
System.exit(0);使整个Java机器退出,并运行其中的所有内容。尽量不要使用它,除非你真的需要这样做。
对于退出,也许请尝试检查此How to close a Java Swing application from the code
答案 2 :(得分:0)
System.exit(0)
退出完整的程序,而不仅仅是当前的线程。如果要退出线程,则有两个选项:一旦相应的Runnable
run()
方法完成,线程就会自动退出,或者您可以使用thread.stop()
终止线程(只是为了完整性,不应该使用。)
答案 3 :(得分:0)
答案 4 :(得分:0)
System.exit(0)
关闭整个JVM。
您的两个实例在同一个JVM上运行:您不要分叉进程,只需创建MyApp
类的另一个实例。所以很明显,两个应用程序"将会被杀死。
您应该向要关闭的JFrame发送终止信号,而不是调用System.exit(0)
frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));
这样,只有JFrame(或"应用程序")才会被杀死。
另一种选择是分叉一个全新的过程。为此,我建议您查看Process
类。
答案 5 :(得分:0)
基本上,您需要更改“退出”的操作,以便能够检测到当前正在运行的另一个“应用”...并在这种情况下做一些合理的事情。也许你警告用户其他活动还没有完成,并警告他如果他真的想现在退出,其他活动将被放弃。也许你以一种完全独立的方式启动其他活动,因此无关紧要。有几个不错的选择,所以这真的成为您的设计决定:什么策略对您和您的用户最直观的感觉?