2

In many software, after we make any changes, the software has to be restarted for the changes to take effect, and sometimes, there is an option to restart the software automatically. How can I implement this in Java?
This is what I have tried:

int o = JOptionPane.showConfirmDialog(
                                frame,
                                "<html>The previously selected preferences have been changed.<br>Watch must restart for the changes to take effect.<br> Restart now?</html>",
                                "Restart now?", JOptionPane.YES_NO_OPTION);
                if(o == JOptionPane.YES_OPTION) {

                    try {
                        Process p = new ProcessBuilder("java", "Watch").start();
                    } catch(IOException e) {
                        e.printStackTrace();
                    }
                    frame.dispose();

However, this doesn't seem to work. The application just terminates. What am I missing here? Thanks in advance!

4

3 回答 3

0

我认为仅使用 JVM 的功能很难做到这一点。

我从来没有这样做过,但是如果您真的想终止当前应用程序正在其中运行的整个 JVM 并启动它的全新实例,我可能会尝试以下方式:

  1. 从您的主应用程序线程中,启动一个 shell 脚本/批处理文件(例如,使用 Runtime.getRuntime().exec("...")` 执行以下步骤:

    • 在后台分叉或使用其他一些系统工具来启动下一步。
    • 也许等待一段时间,这样你就可以确定旧实例已经死了。或者等到某种 PID 文件或类似的东西被删除,告诉你旧的实例已经消失了。
    • 使用您的应用程序主类启动一个新的 JVM,可能给它一些命令行参数或设置一些系统属性来通知这个新实例它实际上是一个自动重新启动的实例(因此它可以对此做出反应,例如通过继续您原来的位置离开)。
  2. 与您的第一个主应用程序实例中的步骤 1 并行,可能等待一小段时间(以确保实际执行后台内容)并调用System.exit(0);或其他一些关闭方法。

也许有一种更简单的方法,这只是我能想到的第一种方法。

于 2013-06-12T13:46:01.917 回答
0

接下来呢:

public static void main(final String[] args) {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            buildAndShowGui(args);
        }
    });
}

public static void buildAndShowGui(final String[] args) {
    final JFrame frame = new JFrame("Window");
    frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    frame.setSize(100, 400);
    frame.setLayout(new FlowLayout());
    JButton button = new JButton("Click!");
    button.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            int option = JOptionPane.showConfirmDialog(frame, "Restart?");
            if (option == JOptionPane.YES_OPTION) {
                frame.dispose();
                restart(args);
            }
        }
    });
    frame.add(button);
    frame.setVisible(true);
    frame.toFront();
}

public static void restart(String[] args) {
    main(args);
}
于 2013-06-12T13:46:30.777 回答
0

这看起来很有趣:让您的应用程序自行重启

基本上,您创建一个脚本来运行您的应用程序。在您的应用中,如果用户选择重新启动,则会创建一个重新启动文件,然后应用退出。退出时,启动脚本会检查是否存在重新启动文件。如果存在,请再次调用该应用程序。

于 2013-06-12T13:38:25.050 回答