2015-12-15 86 views
0

我正在編寫一個非常基本的3D建模程序。我使用LWJGL來呈現我的對象和JavaFX,以在單獨的窗口(新線程)中提供用戶界面。在JavaFX應用程序中使用變量的奇怪行爲

當我看到JavaFX的喜歡採取控制中的應用,但對我來說,這是不是一種選擇。我嘗試將已經創建的場景圖傳遞給JavaFX控制器類,但是我沒有找到正確執行此操作的方法。

看起來好像是不可能將任何東西從外部傳遞到主JavaFX類中。 start方法使用反射魔法從FXML文件加載佈局,但在構造函數中調用此方法,因此變量未初始化。使用參數定義一個新的構造函數會引發異常(無法初始化類)。

掙扎了好幾個小時後,我放棄了,我決定在JavaFX控制器中創建一個新的場景圖併爲其創建一個getter方法。

public class Toolbox extends Application implements Runnable { 

    private ToolboxLogic logic = new ToolboxLogic(); //controller, the scene graph is instantiated 

    ... 

    public SceneGraph getSceneGraph() { 
     return logic.sceneGraph; // returns the scene graph 
    } 
} 

不是一個漂亮的解決方案,但它應該工作,我說。但事實並非如此。 我試圖加載文件在兩個位置:

  • 用代碼寫入LWJGL渲染
  • 具有按鈕,呼叫控制器

方法若我從渲染器加載一個文件,我的對象顯示在屏幕上,但我無法使用按鈕導航,只有根節點出現在場景圖中。

如果我從用戶界面加載一個文件,我可以導航樹上,但它不會在渲染露面。

好像這裏

return logic.sceneGraph; 

的Java會做了深刻的副本,而不是返回一個指針,而我的程序的每個部分正在與它自己版本的場景圖。

什麼是一個問題,我怎樣才能使它正常工作?

謝謝!

+0

我對lwgjl一無所知,所以我不知道它對你的應用程序結構有什麼限制。然而,JavaFX的意圖是'start(...)'方法應該是你的應用程序的入口點(啓動):即它相當於(或替換)main(...)在「傳統」Java應用程序中。所以基本上沒有任何東西可以傳遞給應用程序子類:從這一點開始創建您需要的任何東西。看看http://stackoverflow.com/questions/32739199或http://stackoverflow.com/questions/32464698幫助。 –

+0

我已經看到JavaFX試圖成爲應用程序的入口點,但我的設計無法被重寫爲完全使用JavaFX的方法。我通過使用靜態變量解決了這個問題,這對我的項目非常有用,但是卻是一個非常難看的解決方案。雖然我無法理解它爲什麼會這樣,但爲什麼當它是非靜態的時候我無法獲得變量。不管怎樣,謝謝你! – danalizieors

+0

如果沒有你展示如何暴露當你調用'launch()'(假設你在某處調用'launch()')時創建的'Toolbox'實例,那麼不可能回答這個問題。如果你不能使用標準方法,你可以在我上面評論中的第一個鏈接的答案中使用該技術。 –

回答

0

OK,我把它通過設置場景圖的靜態工作。奇怪!現在,我很好奇,爲什麼它的行爲如此。