2016-06-23 6 views
0

Ich habe ein Problem mit may e (fx) Clipse-Anwendung. Ich möchte beim Start der Anwendung einen Begrüßungsbildschirm anzeigen. Ich habe erfolgreich Klasse StartupProgressTrackerService implementiert und habe meine stateReached Methode aufgerufen. Aber ich habe Probleme mit javafx selbst. Ich möchte eine Bühne mit StageStyle.UNDECORATED erstellen. Jedoch, wenn ich stage.show() Methode stage aufrufen wird nicht sofort gerendert und erscheint kurz nachdem Hauptfenster erstellt wird. Es funktioniert gut, z.B. mit StageStyle.UTILITY. Es rendert auch richtig, wenn ich Methode showAndWait() verwende, aber es stoppt meine App vom Laden, bis ich die Bühne schließe.JavaFX UNDECORATED Bühne nicht angezeigt

Hier ist mein Code:

public class MyStartupProgressTrackerService implements StartupProgressTrackerService { 

    private Stage stage; 

    public MyStartupProgressTrackerService() { 

    } 

    @Override 
    public OSGiRV osgiApplicationLaunched(IApplicationContext applicationContext) { 
     applicationContext.applicationRunning(); 
     return StartupProgressTrackerService.OSGiRV.CONTINUE; 
    } 

    @Override 
    public void stateReached(ProgressState state) { 
     if (DefaultProgressState.JAVAFX_INITIALIZED.equals(state)) { 
      stage = new Stage(StageStyle.UNDECORATED); 
      stage.initModality(Modality.WINDOW_MODAL); 
      stage.setAlwaysOnTop(true); 
      ImageView view = null; 
      try { 
       view = new ImageView(SPLASH_IMAGE); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      BorderPane bp = new BorderPane(); 
      bp.getChildren().add(view); 
      Scene scene = new Scene(bp, 400, 300); 
      stage.setScene(scene); 
      stage.show(); 
     } 
    } 

} 

Antwort

1

ich eine hässliche Lösung gefunden, aber zumindest funktioniert es. Ich habe bemerkt, dass die Methode stage.showAndWait() als Nebeneffekt das Erstellen aller Steuerelemente beendet, die noch nicht gerendert wurden. Der Trick besteht also darin, den Begrüßungsbildschirm zu initialisieren und dann die Dummy-Bühne showAndWait() it und close() sofort zu erstellen. Ich weiß, dass diese Lösung nicht ideal ist, so würde ich es begrüßen, wenn jemand mir alternative Art und Weise zeigen, könnte es :)

Mein Code funktioniert:

public void showSplash() { 
    splashScreen = createSplashScreen(); 
    Stage stage2 = new Stage(StageStyle.TRANSPARENT); 
    splashScreen.show(); 
    Platform.runLater(new Runnable() { 
     @Override 
     public void run() { 
      stage2.close(); 
     } 
    }); 
    stage2.showAndWait(); 
} 

private Stage createSplashScreen() { 
    Stage stage = new Stage(StageStyle.UNDECORATED); 
    stage.setAlwaysOnTop(true); 

    VBox vbox = new VBox(); 
    vbox.getChildren().add(new ImageView(splashImage)); 
    Scene scene = new Scene(vbox, 400, 300); 
    stage.setScene(scene); 
    return stage; 
} 
Verwandte Themen