JavaFX UNDECORATED阶段没有显示

时间:2016-06-23 14:12:39

标签: java javafx eclipse-rcp

我遇到了may e(fx)clipse应用程序的问题。我想在应用程序启动时显示启动画面。我成功创建了实现StartupProgressTrackerService的类,并调用了我的stateReached方法。但是我遇到javafx本身的问题。我想用StageStyle.UNDECORATED创建舞台。但是,当我调用stage.show()时,方法stage不会立即呈现,而是在创建主窗口后出现。它工作正常,例如与StageStyle.UTILITY。当我使用showAndWait()方法时,它也会正确呈现,但它会阻止我的应用加载,直到我关闭舞台。

这是我的代码:

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

}

1 个答案:

答案 0 :(得分:1)

我找到了一个丑陋的解决方案,但至少它有效。我注意到方法stage.showAndWait()作为副作用完成了构建尚未渲染的所有控件。所以诀窍是初始化启动画面,然后立即创建虚拟舞台showAndWait()close()。我知道这个解决方案远非理想,所以如果有人可以向我展示让它工作的替代方法,我将不胜感激:)

我的代码:

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