【发布时间】: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创建的控制器实例,则创建FXMLLoader的instance 并使用instanceload方法,后跟@ 987654332@方法。 -
哦!谢谢@Slaw,我完全错过了——它在这个开发阶段仍然有效,但你是完全正确的,我会遇到问题。我必须返工这部分。