【问题标题】:JavaFX Java17 - exit Fullscreen EventJavaFX Java17 - 退出全屏事件
【发布时间】:2022-01-24 10:27:52
【问题描述】:

我在我的应用程序中添加了一个自定义工具栏(放置我的窗口操作的位置)。到目前为止一切正常。与窗口处理相关,我正在寻找处理“全屏关闭”事件的可能性。设想: 应用程序以窗口模式启动 -> 用户单击(自定义)工具栏按钮以进入全屏模式。工具栏现在将其可见性设置为 false。用户现在通过按钮退出全屏模式(本机 macOS 按钮退出全屏)--> 我现在需要对此做出反应(将工具栏再次设置为可见)但找不到方法。

main.java

MainController mc = new MainController();
Parent root = FXMLLoader.load(getClass().getResource("welcome-view.fxml"));
stage.initStyle(StageStyle.TRANSPARENT);
mc.doSwitchScenes(stage, root);
stage.show();

MainController.java

...
private String title = "Project Apollo";
private Color fillColor = TRANSPARENT;
private int minWidth = 800;
private int minHeight = 600;
...

public void btnMinimize(MouseEvent mouseEvent) {
    Stage stage = (Stage)((Circle)mouseEvent.getSource()).getScene().getWindow();
    // is stage minimizable into task bar. (true | false)
    stage.setIconified(true);
};

public void btnCloseApp(MouseEvent mouseEvent) {
    Platform.exit();
    System.exit(0);
}

public void btnFullscreen(MouseEvent mouseEvent) {
    Stage stage = (Stage)((Circle)mouseEvent.getSource()).getScene().getWindow();
    stage.setFullScreen(true);
    Scene actualScene = ((Node)mouseEvent.getSource()).getScene();
    Parent hbc = (Parent) actualScene.lookup("#headerBarContainer");

    if(hbc != null){
        hbc.setVisible(false);
    }
    System.out.println("clicked FS");

}
...

关键是,至少在 MacOS 上,窗口具有其本机操作系统控制来退出全屏 - 是否可以针对此事件或至少改变舞台大小?

【问题讨论】:

  • 如何首先阅读 stage/window 的 api 文档 ;) 如果应用您从中学到的东西没有按预期工作,下一步是提供一个 minimal reproducible example 来演示问题。顺便说一句:你加载 sn-p 看起来很可疑 - 假设 MainController 是一个加载了通过 fxml 注入的字段/处理程序的类。如果该假设是错误的,您可以考虑将其命名为 xxController 以外的其他名称,以免混淆读者:)
  • @kleopatra - 感谢您的反馈 - 我正处于 Java 的早期阶段,我的 JavaFX 技能只有几周的时间。当然你是对的 RTMF 但我无法通过学校/文档的给定信息找到解决方案。 c0der 足够温和地向我展示了一种通过向 stageProps 添加侦听器来检测更改的方法,这很好,因为我之前没有意识到这一点。是的,控制器通过 fxml 注入了其字段 - 是的,在开发的这个阶段缺少 FXML 标记,但在几分钟前添加了 ;-) - 感谢您的反馈!
  • 关于MainController:您正在创建自己的实例,然后在其上调用方法。这不应该像你期望的那样工作。如果您在 FXML 文件中使用fx:controller,那么FXMLLoader 将通过反射为您实例化MainController。因此,您创建的MainController 的实例与注入其字段的实例不同。如果要访问FXMLLoader 创建的控制器实例,则创建FXMLLoaderinstance 并使用instance load 方法,后跟@ 987654332@方法。
  • 哦!谢谢@Slaw,我完全错过了——它在这个开发阶段仍然有效,但你是完全正确的,我会遇到问题。我必须返工这部分。

标签: java javafx


【解决方案1】:

收听stage.fullScreenProperty()并响应更改:

stage.fullScreenProperty().addListener((ChangeListener) (obs,oldValue,newValue) -> 
                                          {/*TODO respond to changes in full screen */;});

【讨论】:

  • 谢谢 - 就像一个魅力,比我使用更改监听器的场景高度和宽度的方法要好得多
猜你喜欢
  • 1970-01-01
  • 2014-09-27
  • 2019-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-28
相关资源
最近更新 更多