我一直想制作一个在屏幕中间显示十字准线的JavaFX应用程序,但是每当我在ImageView上悬停时,我不能做后台任务,就像它阻止了我的鼠标事件一样。
我试过使用Node#setMouseTransparent
,但它并没有真正工作,同样的Scene.setFill(null)
这是我现在的代码:
private void setStageProperties() {
Screen screen = Screen.getPrimary();
Rectangle2D bounds = screen.getBounds();
stage.setWidth(bounds.getWidth());
stage.setHeight(bounds.getHeight());
Scene scene = new Scene(this);
scene.setFill(null);
stage.setScene(scene);
stage.setAlwaysOnTop(true);
this.primary = new Stage();
primary.initStyle(StageStyle.UTILITY);
primary.setOpacity(0);
primary.setHeight(0);
primary.setWidth(0);
primary.show();
stage.initOwner(primary);
stage.initStyle(StageStyle.TRANSPARENT);
double centerX = bounds.getMinX() + bounds.getWidth() / 2;
double centerY = bounds.getMinY() + bounds.getHeight() / 2;
stage.setX(centerX - stage.getWidth() / 2);
stage.setY(centerY - stage.getHeight() / 2);
}
个字符
运行配置:
的数据
--add-opens javafx.graphics/javafx.stage=com.example.demo --add-opens javafx.graphics/com.sun.javafx.tk.quantum=com.example.demo
型
1条答案
按热度按时间0aydgbwb1#
node
mouseTransparent
属性只是让节点鼠标在JavaFX应用程序的上下文中是透明的,而不涉及JavaFX应用程序和窗口系统的其他部分。要做到这一点,你需要在本机窗口系统中更改窗口样式。Windows 11解决方案
这是一个仅限Windows的解决方案,基于以下想法:
使用VM args运行:
字符串
型
型
型
执行命令
从项目根目录的命令行运行的示例命令。为Windows 11和JDK 21提供,假设您已经运行
mvn clean install
来构建应用程序。型
这些命令仅用于测试目的。通常,您可以在IDE运行配置中配置VM参数。或者,应用程序将使用
jlink
或jpackage
(可能通过Maven或Gradle的构建工具插件)进行链接和打包,并在应用程序打包中包含的启动脚本中指定VM参数,然后双击即可运行安装的应用程序。从IntelliJ Idea运行
提供虚拟机(VM)参数 * 而不是程序参数 *。VM参数需要在 * 要运行的类之前 * 提供。选择
Modify options | Add VM options
,然后在“VM选项”框中添加VM参数,如以下答案所示:替代方案
这个建议并没有破坏模块化,并依赖于应用程序代码中的JNA访问(尽管我没有尝试过)。
除非你改变窗口设置,类似于上面为Windows定义的那样,否则显示JavaFX内容的窗口将拦截鼠标操作。也许你可以做一些棘手的事情,比如捕获鼠标输入,然后暂时隐藏舞台,并使用Robot触发鼠标操作,也许与一些
Platform.runLater
调用结合使用,但这有点黑客。附加信息
正如Slaw在评论中指出的那样:
因为我发誓让舞台透明/无装饰,让场景透明,让鼠标下的所有节点都是鼠标透明或没有背景/填充(甚至部分,例如,透明像素的图像),让你可以与过去舞台后面的任何东西进行交互。至少,我相信它适用于Windows 10(尽管在其他平台上不适用,例如macOS)。
我用Windows 11 Pro和JavaFX 21.0.1检查了一下,它的工作原理和Slaw记忆中的差不多,如果你点击舞台的透明区域,鼠标会和舞台下的窗口进行交互。
但是,如果您单击舞台的非透明区域,则鼠标操作不会在舞台下的窗口中注册,除非使用本答案中提供的JNA代码。
常见问题
错误:
型
这意味着你的VM参数是错误的。
当您运行应用程序时,未拾取此VM参数:
型
com.example.demo
是这个例子中的模块名,而不是包名。除非你的模块也命名为com.example.demo
,否则它将无法工作。有关--add-opens
开关的更多信息,请参阅java手册页。