2016-04-15 127 views
0

我有一個程序使用簡單的預加載程序,而init()方法創建主要的gui。一切正常,但在init()方法完成並且預加載器消失之後,在主要階段出現之前會有明顯的延遲。我說很明顯,因爲它可能高達7秒,足以讓用戶感到困惑。Preloader和Stage之間的延遲顯示

我試圖儘可能少的投入儘可能在start()方法:

public void start(Stage stage) { 
    /*Scene*/ 
    scene = new Scene(root, 1200, 700); 
    stage.setScene(scene); 
    scene.setFill(null); 

    /*Stage*/ 
    stage.initStyle(StageStyle.TRANSPARENT); 
    stage.centerOnScreen(); 
    stage.show(); 

} 

是否有降低/消除這種延遲的方法嗎?將預加載器完全取消並將其作爲主程序中的一個階段實施會更好嗎?提前致謝。

編輯:

我把Maverick283的諮詢和實施的預加載的淡出。還是有一點延遲,所以我發送了最後通知(從主程序到預加載程序)顯示主舞臺,它的工作完美!

public void start(Stage stage) { 
    /*Scene*/ 
    scene = new Scene(root, 1200, 700); 
    stage.setScene(scene); 
    scene.setFill(null); 

    /*Stage*/ 
    stage.initStyle(StageStyle.TRANSPARENT); 
    stage.centerOnScreen(); 
    stage.show(); 
    notifyPreloader(new Preloader.ProgressNotification(0.99)); 
} 

回答

1

Oracle

應用程序啓動之前,通過預加載最後接收的狀態變更通知StateChangeNotification.Type.BEFORE_START。處理完成後,調用應用程序的start()方法。但是,在應用程序準備好在start()方法調用後顯示其階段之前,可能需要一些時間。如果預加載器階段已經隱藏起來,那麼可能會有一段時間,應用程序在屏幕上什麼都不顯示。

因此,他們提供的示例代碼如何解決:

@Override 
public void handleStateChangeNotification(StateChangeNotification evt) { 
    if (evt.getType() == StateChangeNotification.Type.BEFORE_START) { 
     if (isEmbedded && stage.isShowing()) { 
      //fade out, hide stage at the end of animation 
      FadeTransition ft = new FadeTransition(
       Duration.millis(1000), stage.getScene().getRoot()); 
       ft.setFromValue(1.0); 
       ft.setToValue(0.0); 
       final Stage s = stage; 
       EventHandler<ActionEvent> eh = new EventHandler<ActionEvent>() { 
        public void handle(ActionEvent t) { 
         s.hide(); 
        } 
       }; 
       ft.setOnFinished(eh); 
       ft.play(); 
     } else { 
      stage.hide(); 
     } 
    } 
} 

如果你繼續閱讀,甚至有共享的兩個階段(預加載和主要應用階段)的方式...