当前位置: 首页 > 知识库问答 >
问题:

JavaFX未装饰舞台未显示

韩恺
2023-03-14

我对may e(fx)clipse应用程序有问题。我想在应用程序启动时显示一个启动屏幕。我成功地创建了实现StartupProgressTrackerService的类,并调用了我的stateReach方法。然而,我对javafx本身有问题。我想用StageStyle创建Stage。未装饰。然而,当我调用stage时。show()方法阶段不会立即渲染,并在创建主窗口后立即显示。它可以很好地工作,例如与舞台风格(StageStyle)配合使用。实用程序。当我使用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个答案

万嘉石
2023-03-14

我找到了一个丑陋的解决方案,但至少它是可行的。我注意到了这个方法。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;
}
 类似资料:
  • 这是我使用JavaFX的第二天,如果这似乎是一个太常见的知识问题的话。提前谢谢大家。 ..

  • 我有一个未装饰的FXML舞台。我创建了一个按钮来最小化窗口,并在初始化方法的控制器类中为其创建了一个事件。 问题: 返回,而窗口在视觉上没有任何变化。 如果我从UNDECORATED切换到默认,我的自定义按钮完全有效。

  • 我创建了一个小库,其中包含一个自定义窗口/阶段,用于使我的所有应用程序具有恒定和统一的外观。基本上,这只是一个没有装饰的舞台,有一个锚具,包含定制的最小化/最大化/关闭和调整大小控件。 唯一的问题是按下最小化按钮时执行的方法。在我的主系统(ArchLinux)上运行应用程序时不会发生任何事情,看起来应用程序被冻结了,这里有一个可视化示例:在Imgur上上传的示例图像,还没有足够的代表来发布图像 最

  • 我一直试图从控制器打开一个新窗口以显示进度条: 请帮忙。没有例外,也没有错误。谢谢 编辑:我已经找到了它不显示的原因,这是因为在后面的代码中我有一个函数:阻止程序刷新我的场景和显示元素。是否有一种方法可以在后台或另一个线程中运行这一行(我以前从未使用过线程)再次感谢你的帮助。

  • 我有一个未装饰的JavaFX舞台,我自己的最小化,最大化 有没有办法通过单击任务栏图标来最小化纯Java代码未修饰的阶段?如果不是的话,我该怎么做,比如说,JNA? 编辑:好的,我一直在尝试用JNA解决这个问题,但由于几乎没有C/C/JNA,我在设置这个方面有点麻烦。如果有人帮我把这些东西拼凑起来,我将不胜感激。。 到目前为止,这是我的代码: 编辑2:我最终在这一点上做得更进一步,但当我重新设置W