2017-01-14 100 views
0

我想知道在調用主應用程序的init方法之前顯示dialog(Stage)的最佳方式。我不能在init方法中實現它,因爲它不能在JavaFX應用程序線程上運行,並且在啓動方法中實現它時,我將失去一個預加載器的選項(只有在初始化階段才存在,如果我理解它的話)正確)。javafx在init之前顯示對話框

它應該像eclipse中的工作區選擇器或lightroom中的目錄選擇器。

我能想到的解決方案是創建兩個程序,一個啓動程序和主應用程序,但如果它可能發生在同一個應用程序中,我更喜歡它。如果只能這樣做,如何使用與啓動程序啓動相同的Java版本啓動主要app.jar(由於命令行/終端允許用不同版本啓動應用程序,因此不能使用在路徑中配置的Java版本進行調用)。

感謝您的建議。

+0

你爲什麼要這麼做? 'init()'方法是FX應用程序生命週期初始化的一部分:在完成之前,您幾乎不希望運行部分應用程序。爲什麼不像往常一樣在'start()'方法中顯示對話框,那麼在顯示主應用程序窗口之前,當對話框被解散時需要進行任何處理? –

+0

@James_D我想這樣做,因爲代碼花費足夠的時間用於預加載器/啓動畫面發生在用戶選擇後,據我瞭解,預加載器生命週期是在'init()'方法期間,因此用戶可能在主應用程序Stage出現之前等待幾秒鐘,而不會看到進度條。這意味着我不需要預加載器並在「start()」方法中打開一個裝飾少對話框作爲進度指示啓動畫面,直到主舞臺可以顯示爲止? – Scourge

+1

所以你可以使用preloader機制。儘管使用'start()'方法顯示帶有進度條的啓動畫面會更容易(imo),但是無論您在做什麼,都需要花費大量時間在後臺線程的任務中,並在完成後顯示主屏幕。 –

回答

0

啓動JavaFX應用程序是通過調用Application.launch()完成的,其中LauncherImpl#launchApplication被調用。

launchApplication中,私人方法launchApplication被調用具有以下簽名preloaderClass說法

現在preloader是你叫對話的地方

就叫你對話框,把你的其他功能這裏:

public class MyPreloader extends Preloader { 
    private Stage preloaderStage; 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     this.preloaderStage = primaryStage; 

     VBox loading = new VBox(20); 
     loading.setMaxWidth(Region.USE_PREF_SIZE); 
     loading.setMaxHeight(Region.USE_PREF_SIZE); 
     loading.getChildren().add(new ProgressBar()); 
     loading.getChildren().add(new Label("Please wait...")); 

     BorderPane root = new BorderPane(loading); 
     Scene scene = new Scene(root); 

     primaryStage.setWidth(800); 
     primaryStage.setHeight(600); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    @Override 
    public void handleStateChangeNotification(StateChangeNotification 
     stateChangeNotification) { 

     if (stateChangeNotification.getType() == Type.BEFORE_START) { 
      preloaderStage.hide(); 
     } 
    } 
} 

然後將它傳遞給launchApplication方法

And just perfect!
Enjoy!

+0

到目前爲止,感謝您的回覆,但實際上我不明白應該如何處理。我的意思是,即使在主應用程序被初始化之前(因此在Preloader顯示之前),對話框應該會出現,因爲該對話框中的用戶操作應該爲init-method設置一個重要變量,甚至取消整個啓動。 或者有關你的想法的問題:當我將它放入預加載器時,如何讓init方法等待用戶輸入繼續初始化並仍然顯示帶有進度的預加載器「啓動畫面」? – Scourge

+0

但是你有舞臺對象在你的處置沒有? – GingerHead

+0

是的,我有,但剩下的問題是如何在用戶做出選擇之前阻止主應用程序的'init()'方法運行? 通過在主應用程序的'start()'方法中實現用戶選擇,啓動畫面和加載,可以實現一種不同的方法,但會導致結構更簡潔。 – Scourge

相關問題