2013-11-23 50 views
2

我想在我的应用程序中实现reset功能,该功能可清理某些目录,复制文件等,然后为了完成该过程,我需要重新启动它。如何让您的java应用程序自行重新启动

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

我的应用程序的核心是扩展了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); 
    } 
+0

@DNA尝试过,我不工作。 – Yoda

+4

非常不完整,我担心你的问题是。对我们来说,澄清一下吧。很大。是的,嗯。 GUI,是吗?摇摆,是吗? –

+1

这可能是XY问题吗? http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem – Brandon

回答

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:我相信马克张贴更好的解决方案:https://stackoverflow.com/a/48992863/1123020

+2

无法正常关闭应用程序。 – ralphgabb

+0

@ralphspoon几年后我尝试了这种方法,但它停止工作,但当时我发布了正在执行并正确执行的代码。只是让知道。也许它是依赖于环境的。在此期间我改变了操作系统。 – Yoda

+0

这累积JAVA_TOOL_OPTIONS,如果全局设置。 –

2

你的问题/我的意见:

我要实现我的应用程序,清理一些目录复位功能,拷贝文件等。那么为了完成这个过程我需要重新启动它。如何使应用程序自行重启?

这是许多应用程序的共同特点/需要,而不仅仅是学术作业。不幸的是,没有一个适合所有的解决方案,它将取决于你的程序的具体情况。如果您的程序是非常模块化的,并且具有智能M-V-C分离关注点,那么执行此操作变得更容易,通常只需将模型重置为其初始状态,或者将新模型加载到GUI中即可。

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

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

在我的情况下,我想重新加载由许多JPanel组成的JFrame。我已经这样做了:

同样,我敦促你不要走这条路。

您可以将一些JTextComponents放置到ArrayList中以便于重置。例如,你可以重置你的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也不是那么好。我有很多的静态块,加载序列化的文件等,我需要真正重新启动它。也许有简单的方法来执行应用程序本身。

对不起,但这只能告诉我,你的程序可能会让它的组织得到改进。它应该是可重置的,如果没有,请考虑改变它,以便它可以如此。它是否遵循模型 - 视图 - 控制结构?如果没有,请考虑这样做。

+0

我发现我的解决方案 - >处理JFrame不太好。我有很多的静态块,加载序列化的文件等,我需要真正重新启动它。也许有简单的方法来执行应用程序本身。 – Yoda

+0

@Yoda:请参阅编辑回答。 –

+1

@Yoda从本身重新启动Java进程可能会变得复杂。你需要考虑类路径,确切的命令行,系统属性,谁知道还有什么。气垫船是正确的。最简单/最可靠的解决方案是将应用程序的状态对象设计为可重置,以便重置它。 – Brandon

相关问题