我遇到了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();
}
}
}
答案 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;
}