2

我想reset在我的应用程序中实现清理一些目录、复制文件等的功能,然后为了完成我需要重新启动它的过程。

如何让应用程序自行重新运行?我认为打开第二个实例并关闭这个就足够了,尽管它不是真正的重启。

我的应用程序的核心是类扩展,JFrame但是有很多静态块在程序执行时读取类的扩展。我需要以编程方式重新启动我的应用程序,以便再次创建/执行所有静态集合和块。

就是这样开始的。

SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            new Window().createGUI();
        }
    });

这似乎工作正常:

public void restart() {
    /*  dispose();
    Window.main(null);*/
    StringBuilder cmd = new StringBuilder();
    cmd.append(System.getProperty("java.home") + File.separator + "bin" + File.separator + "java ");
    for (String jvmArg : ManagementFactory.getRuntimeMXBean().getInputArguments()) {
        cmd.append(jvmArg + " ");
    }
    cmd.append("-cp ").append(ManagementFactory.getRuntimeMXBean().getClassPath()).append(" ");
    cmd.append(Window.class.getName()).append(" ");

    try {
        Runtime.getRuntime().exec(cmd.toString());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.exit(0);
}
4

2 回答 2

4

这是来自另一个主题,但与另一个主题中公认的问题相反,这个问题确实有效。

public void restart() {
          StringBuilder cmd = new StringBuilder();
            cmd.append(System.getProperty("java.home") + File.separator + "bin" + File.separator + "java ");
            for (String jvmArg : ManagementFactory.getRuntimeMXBean().getInputArguments()) {
                cmd.append(jvmArg + " ");
            }
            cmd.append("-cp ").append(ManagementFactory.getRuntimeMXBean().getClassPath()).append(" ");
            cmd.append(Window.class.getName()).append(" ");

            try {
                Runtime.getRuntime().exec(cmd.toString());
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.exit(0);
    }

27/02/2018:我相信 Mark 发布了更好的解决方案:https ://stackoverflow.com/a/48992863/1123020

于 2013-11-23T23:52:48.033 回答
2

你的问题/我的评论:

我想在我的应用程序中实现重置功能,它会清理一些目录、复制文件等,然后为了完成我需要重新启动它的过程。如何让应用程序自行重新运行?

这是许多应用程序的共同特征/需求,而不仅仅是学术作业。不幸的是,没有一种万能的解决方案,这完全取决于您的程序的具体情况。如果您的程序非常模块化并且使用智能 MVC 关注点分离编写,那么执行此操作会变得容易得多,通常只需将模型重置为其初始状态,或者将新模型加载到 GUI 中。

我认为打开第二个实例并关闭这个就足够了,尽管它不是真正的重启。

我认为这是一个非常糟糕的主意。最好简单地将文本组件、按钮、复选框等的状态重置为原始状态。同样,您的代码越模块化,就越容易做到。每个单独的模块都可以有自己的reset()方法来负责初始化它。

就我而言,我想重新加载由许多 JPanel 组成的 JFrame。我已经这样做了:

再次,我敦促你不要走这条路。

您可以将一些 JTextComponents 放入 ArrayList 以便于重置。例如,您可以在 reset 中重置 GUI 字段。就像是:

public void reset() {
  // assuming you have an ArrayList of JTextComponents called textComponents
  for (JTextComponent textComponent : textComponents) {
    textComponent.setText("");
  }

  // same if you had a bunch of comboboxes in a List called comboBoxes
  for (JComboBox comboBox : comboBoxes) {
    comboBox.setSelection(-1); // consider removing listeners first, then re-adding them

  //   etc for other components
  }
}

编辑

我发现我的解决方案 -> 处理 JFrame 不太好。我有很多静态块,加载序列化文件等。我需要重新启动它。也许有一种简单的方法可以让应用程序自行执行。

抱歉,但这仅表明您的程序可能会改进其组织。它应该是可重置的,如果不是,请考虑更改它以使其可以重置。它遵循模型-视图-控制结构吗?如果没有,请考虑这样做。

于 2013-11-23T23:33:59.283 回答