2013-11-23 72 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

相關問題