2016-04-15 17 views
0

Ich habe ein Programm, das einen einfachen Preloader verwendet, während die init() Methode die Hauptgui erstellt. Alles funktioniert gut, aber nachdem die Methode init() abgeschlossen ist und der Preloader verschwindet, gibt es eine spürbare Verzögerung, bevor die Hauptbühne auftaucht. Ich sage bemerkbar, weil es bis zu 7 Sekunden dauern kann, genug für einen Benutzer, um verwirrt zu werden.Verzögerung zwischen Preloader und Bühne gezeigt

Ich habe versucht, so wenig wie möglich in der start() Methode zu setzen:

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(); 

} 

Gibt es eine Möglichkeit zu reduzieren/eliminieren diese Verzögerung? Wäre es besser, den Preloader komplett zu verschrotten und als Bühne im Hauptprogramm zu implementieren? Danke im Voraus.

EDIT:

nahm ich Maverick283 Rat und umgesetzt fadeOut der preloader. Es gab immer noch ein bisschen Verspätung, also schickte ich die letzte Benachrichtigung (vom Hauptprogramm zum Preloader) nach zeigte die Hauptbühne und es funktionierte perfekt!

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)); 
} 

Antwort

1

Von Oracle:

Die letzte Meldung Zustandsänderung vom Preloader vor der die Anwendung gestartet ist StateChangeNotification.Type.BEFORE_START. Nach der Verarbeitung wird die start() -Methode der Anwendung aufgerufen. Es kann jedoch einige Zeit dauern, bis die Anwendung bereit ist, ihre Stufe anzuzeigen, nachdem die Methode start() aufgerufen wurde. Wenn die Preloader-Stufe bereits ausgeblendet ist, kann es einen Zeitraum geben, in dem die Anwendung nichts auf dem Bildschirm anzeigt.

So bieten sie Beispielcode, wie das zu beheben:

@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(); 
     } 
    } 
} 

Wenn Sie weiter lesen gibt es auch eine Möglichkeit, die beiden Stufen des Teilens (preloader und Hauptstufe) ...

Verwandte Themen