2014-01-15 47 views
0

我一直在用Java編寫一個模擬程序,現在用JavaFX生成結果圖。然而,我很難理解如何調用圖表,以便當我嘗試第二次運行模擬(並生成圖表)時,我不會看到「不能調用launch()多於一次「錯誤。我讀過launch()只能調用一次,那麼在模擬的第二次運行中,我需要更改以成功調用圖形?如何「重新啓動」JavaFX應用程序?

public class AnswerWorker extends SwingWorker<Void, Integer> { 

protected Void doInBackground() throws Exception 
{ 
    AMEC.runsimulation(); 
    return null; 
} 

protected void done() 
{ 
try { 
    Graphs.launch(Graphs.class, ""); 
    JOptionPane.showMessageDialog(InputGUI.this, AMEC.unsuccesfulpercentage + "% of iterations had trucks that had to sleep over"); 
    AMEC.unsuccesfulpercentage = 0; 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 

} 
} 

用非常標準的圖形類:

public class Graphs extends Application { 

    @Override public void start(Stage stage) { 
    .... 
    stage.show(); 
    } 
} 
+0

在你的[上一個問題]中,Sebastian(http://stackoverflow.com/questions/21132278/is-it-possible-to-draw-graphs-using-javafx-in-a-normal-java-application),Sebastian給出了這個答案:使用'JFXPanel'。 –

回答

2

你爲什麼在JavaFX應用程序使用的SwingWorker?如果您的圖形計算爲在JavaFX應用程序中顯示,則沒有理由使用事件派發線程(AWT)。如果我沒有弄錯,隨着JDK 8的發佈,JavaFX應用程序線程和事件調度線程will become one,所以你沒有理由使用SwingWorker。如果我真的錯了,仍然沒有理由使用SwingWorker。雖然可能在JavaFX應用程序中耦合Swing組件,但在操作Swing組件時,應僅使用EDT,而不應使用JavaFX節點。下面的鏈接這樣說:

... JavaFX應用程序線程從Swing和AWT事件指派線程(EDT)不同的線程,因此,務必嵌入JavaFX代碼到Swing應用程序時,應考慮...

來源:http://docs.oracle.com/javafx/2/architecture/jfxpub-architecture.htm

要了解如何把過程在後臺完成,並找出哪些線程負責處理JavaFX的元素,看看這個鏈接:

http://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm

關於你的問題,我相信JavaFX應用程序的開始只應該調用一次。非常重要的是,當啓動JavaFX應用程序時,會捕獲main方法的線程,並且僅在JavaFX應用程序完成時纔會返回。請參閱Application DOC(特別是this部分)。還需要注意的是JavaFX應用程序的生命週期由以下步驟給出:

生命週期

的入口點JavaFX應用程序是應用程序類。 JavaFX運行將執行以下操作,以便,每當應用程序被啓動:

  1. 構建指定的應用程序類
  2. 的實例調用init()方法
  3. 呼叫開始(javafx.stage。 Stage)方法
  4. 等待應用程序完成,發生下列情況時發生以下任一情況: 發生以下情況: 應用程序調用Platform。退出() 最後一個窗口已關閉,平臺上的implicitExit屬性爲true
  5. 調用stop()方法

你可能使用了錯誤的方法。我相信在處理某些事情時應該讓JavaFX應用程序運行。一旦你在後臺處理了你想要的東西,你應該讓你的JavaFX應用程序顯示結果。 JavaFX應用程序在後臺處理某些內容時的運行方式完全取決於您。也許你應該在處理某些東西時隱藏窗口,並在完成圖表後再次顯示它。正如我所說,這是你必須決定的事情。我建議你看一下涉及窗口系統的文檔,從Window開始,然後是Stage

有任何問題,我們在這裏。祝你好運! :)

編輯

從我所看到的,用戶jewelsea是正確的。顯然,EDT和JavaFX應用程序線程將不能確定(如果發生這種情況,這將非常有趣)。但無論如何,小心不要讓自己與兩個線程的使用相混淆。

+0

「隨着JDK 8的發佈,JavaFX Application Thread和Event Dispatch Thread將成爲一個」=>你錯了。這種支持只能在JDK 8中通過使用未公開的實驗性標誌來啓用。默認情況下,JavaFX應用程序線程和事件分派線程是不同的線程。 – jewelsea