我有一个用.jar编译的Java程序,所以最终用户实际上不能只是在控制台中按ctrl + c。
他们必须在任务管理器中结束java进程 但是,有一种更简单的方法,不存在吗?
public class Test extends JFrame {
private JPanel contentPane;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Test frame = new Test();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public Test() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
setContentPane(contentPane);
JButton go = new JButton("Go");
go.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Process p;
Runtime r = Runtime.getRuntime();
while(true) {
try {
p = r.exec("notepad.exe");
p.waitFor();
} catch (IOException | InterruptedException e1) {
e1.printStackTrace();
}
}
}
});
contentPane.add(go);
}
}
正如你所看到的,一旦你按下Go按钮,它就会产生一个记事本过程 一旦你关闭记事本,就会产生另一个记事本。 我希望它能够做到这一点。
然而,没有办法阻止它停止。例如,按下窗格上的X不会执行任何操作。
如何使X有效地关闭Java程序,同时保留上述所有意外情况?
答案 0 :(得分:0)
1)执行的操作在EDT线程上运行:java线程执行所有事件/事件处理程序。由于p.waitFor没有立即返回,它将阻止所有进一步的事件处理
2)永远不应该在edt线程上运行长时间运行的操作。在这种情况下,我建议spwan一个新线程,它将启动notepad.exe并在另一个线程中等待它...
3)另一点是:为什么要等notepad.exe退出?这里有一些微妙的不一致,从一个角度来看,你希望应用程序继续正常处理(点击x框应该退出应用程序),另一方面你希望你的应用程序不要继续正常处理,因为你希望等待记事本退出...
更好地解释您的诉讼