JavaFX 2.2 不可见节点的鼠标事件

2024-04-21

我正在尝试接收 JavaFX 2.2 中不可见节点的 MouseEvents。将其视为一个交互式但不可见的区域,例如当鼠标悬停在其上时应触发操作。问题是,这不是静态定义的区域,而是有多个区域(很多)可以由应用程序移动和调整大小。因此,对于我的用例来说,全局监听鼠标移动并执行手动检测(例如 MouseMove-Events)会产生大量开销。

目前,我正在尝试一个透明的矩形(new Rectangle(200, 100, Color.TRANSPARENT)),但实际/最终应用程序将为其使用某种窗格,因为它实际上是其他组件的可拖动容器(当未装满组件时,它具有透明区域,并且也必须在这些透明区域上检测到 MouseMoves) 。

另外,我希望得到能够帮助我更好地理解 JavaFX 2.2 通常如何根据节点的可见性处理 MouseEvents 的答案。

到目前为止,我的实验显示了以下一般见解:

  • 给定一个透明场景: 当用户单击透明区域时,鼠标事件只会传递到外部应用程序(视觉上位于场景下方)。当用户单击场景的可见像素时,无法将鼠标事件“传递给操作系统”。正确的?

  • 默认情况下,其他节点顶部的窗格将吞咽任何 MouseEvent,除非它是 MouseTransparent 或 MouseClick 出现在不可见(透明)区域上。

  • pickOnBounds(true|false)是否可以启用(true)基于边界(矩形)的 MouseEvents 检测或禁用它(false)。后者仅有效处理可见像素/区域的鼠标事件。pickOnBounds(true)似乎不适用于完全不可见的节点。正确的?

  • 我的实验表明,一个节点至少需要填充 -new Color(1,1,1,0.004)被认为是可见的。较低的 alpha 值被认为是不可见的,这会导致 MouseEvents 不被处理,即使pickOnBounds(true)已被调用。

我做对了吗?那么不可见的 Node 将无法接收 MouseEvents。

或者有什么特殊要求pickOnBounds上班?我是否需要仅在显示节点或类似的内容后调用它? 还有其他建议吗?


简而言之:使用 Node.setOpacity(0.0)

opacity 属性控制节点的“视觉透明度”,而不影响其接收事件的能力,请参阅APIdocs http://docs.oracle.com/javase/8/javafx/api/javafx/scene/Node.html#opacityProperty。将此属性设置为零可以实现您(和我)正在寻找的效果:一个不可见但对鼠标敏感的“热区”-Node。

这与Node.setVisible(false)我首先尝试过。该方法还会禁用事件处理。来自 Node.setVisible() API 文档:

不可见节点永远不会接收鼠标事件或键盘焦点,并且当它们变得不可见时永远不会保持键盘焦点。

“隐形”的真正意思是“调用后setVisible(false)“并且不应与图像中的不透明或完全透明像素相混淆。

由于缺乏声誉,我无法直接发布屏幕截图,因此:链接到屏幕截图 https://i.stack.imgur.com/3Z7ae.png显示了下面示例代码的热区布局(出于明显的原因,屏幕截图中节点的不透明度未设置为 0)。

该示例使用一个 Group 作为热区,其中包含一个矩形和一个圆形来定义捕获鼠标事件的区域。只需要在 Group 上设置不透明度属性和鼠标处理程序,而不是在其子组上设置。

这样您就可以构建任意形状的热区。 如果您想使用具有透明区域的图像作为热区,则其pickOnBounds属性需要设置为false因此要考虑实际的图像内容,而不仅仅是边界框。

希望能帮助到你!

public class HotZoneTest extends Application {

    @Override
    public void start(Stage primaryStage) {
        StackPane root = new StackPane();
        Scene scene = new Scene(root, 300, 250);
        primaryStage.setScene(scene);
        primaryStage.show();

        Group hotZone = new Group();
        root.getChildren().add(hotZone);

        hotZone.getChildren().add(new Rectangle(10, 20, 100, 50));
        hotZone.getChildren().add(new Circle(50, 120, 20));

        hotZone.setOpacity(0.4); //set to 0.0 to make invisible

        EventHandler handler = new EventHandler() {
            @Override
            public void handle(Event e) {
                System.out.println("hotZone mouse event: " + e);
            }
        };
        hotZone.addEventHandler(MouseEvent.MOUSE_ENTERED, handler);
        hotZone.addEventHandler(MouseEvent.MOUSE_CLICKED, handler);
        hotZone.addEventHandler(MouseEvent.MOUSE_EXITED, handler);

    }

编辑:关于您的具体子问题(据我所知,我不是外汇专家:))

当用户单击时,无法将鼠标事件“传递给操作系统” 在场景的可见像素上。正确的?

有趣,从未尝试过。对可能有效的纯粹猜测:获取鼠标事件的屏幕坐标,将窗口移开,使用 java.awt.Robot 将操作系统光标移动到鼠标事件的坐标,如果需要,单击此处,然后移动您的窗口窗户后面。 当心:听起来完全是黑客行为!

其他节点之上的窗格默认会吞下任何 MouseEvent 除非它是 MouseTransparent 或 MouseClick 出现在 不可见(透明)区域。

我也是这么理解的;但不确定鼠标进入/退出。对于那些你可以听的人MOUSE_ENTERED_TARGET/MOUSE_EXITED_TARGET至少在父级中确定哪个孩子进入/退出。如果您想阻止子级接收事件,请在父级上注册事件过滤器并在那里使用事件。

pickOnBounds(true|false) 可以启用(true)基于边界的 (矩形)检测 MouseEvents 或禁用它(假)。后者 仅有效处理可见像素/区域的鼠标事件。

Yes.

pickOnBounds(true) 似乎不适用于完全不可见的节点。

对于通过调用使其不可见的节点为真setInvisible(true).

我的实验表明,一个节点至少需要填充 - 新 颜色(1,1,1,0.004)被视为可见。

无法发表评论,但你的实验结果似乎不错。

那么不可见的节点将无法接收鼠标事件。

Using .setOpacity(0.0)使节点“视觉上不可见”,但仍然接收事件并遵循 setbickOnBounds

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaFX 2.2 不可见节点的鼠标事件 的相关文章

  • 如何查明转换是否已在节点上运行?

    我怎样才能知道节点上是否已经有一个转换正在运行 例如FadeTransition 您可以随时使用过渡 http docs oracle com javafx 2 api javafx animation Transition html 状态
  • 方法不会覆盖 Eclipse 中的包可见方法

    从 Eclipse Java 编译器设置 方法不会覆盖包可见方法 包默认方法在不同的包中不可见 因此无法被覆盖 启用此选项时 编译器会以错误或警告的形式发出此类情况的信号 如何触发此警告 错误 我正在寻找代码示例 Foo java pack
  • Elm:向 SVG 元素添加点击事件不起作用 – 这可能吗?

    我一直在尝试添加一个on click 向 Elm 中的 SVG 元素发送事件 以确定鼠标单击在该元素内的相对位置 下面给出了一个代码示例 您可以尝试运行http elm lang org try http elm lang org try显
  • jQuery:如何全局获取整个文档正文中我悬停的最里面的 dom 元素?

    我想检测鼠标在整个文档主体上的移动 并能够准确地判断我将鼠标悬停在 DOM 的哪一部分上 我所说的 哪一部分 是指鼠标当前位于最里面的 DOM 元素 我可以将悬停绑定到整个文档正文 但是 this 会给我 body 而不是最里面的元素 或者
  • 在 Swing JFrame 上添加 WebView 控件

    我正在开发与 JavaFX 控件混合的 Swing 应用程序 我创建了一个 JavaFX 控件 WebView 浏览 HTML 文件 但我想要 要知道 如何在 Swing 的容器上添加此 Web 视图控件JFrame 鉴于已经存在jFram
  • 在 JavaFX 上的按钮中加载 SVG 文件

    我在 Inkscape 中创建了一个 SVG 图像 我把它放在与我的班级相同的目录中 有没有办法加载该图像并将其转换为 SVG 路径 这背后的想法是获得该图像getClass getResource image svg toExternal
  • JavaFX:如何在不关注主窗口的情况下关闭子窗口

    我试图在一定时间后以编程方式关闭子窗口 这个子窗口的initOwner是与主舞台一起设置的 但是关闭这个子窗口后 主窗口就会获得焦点 有什么方法可以在不关注主窗口的情况下关闭子窗口 以编程方式 下面是我的问题的快速演示 我尝试了所有可能的方
  • 阻止 robots.mouseMove 生成​​ MouseEvent?

    我有一个 3D 游戏 每次移动光标时 我希望它重置到中间 问题是 robots mouseMove 调用 MouseEvent 它确实有意义 并重置位置 所以我无法旋转 谢谢你 我更喜欢如下代码 component removeMouseL
  • 按类 ID 隐藏 div

    如果我有 div class ad 和 div class ad 如何通过隐藏带有类广告的所有 div 来隐藏两者 我试过document getElementsByClassName ad style visibility hidden
  • 闪亮的滑块限制释放鼠标左键的反应

    我正在使用 Shiny 应用程序 其中可能需要一些时间才能将滑块设置为正确的值 因此 在尝试将滑块设置为正确的值 并且不释放鼠标左键 时 即我的本地 服务器观察到几个新值并做出相应反应 由于我的服务器对任何新值的响应可能需要几秒钟 如果我可
  • mousemove 事件是否每帧触发一次?

    In this 小提琴演示 https jsfiddle net JoeZheng uy9poL1j 按下并移动鼠标会根据鼠标的位置绘制点 绘制方法是听mousemove回调 但它绘制了离散点 表明mousemove事件不会连续触发 更重要
  • 无法使用本机捆绑 exe 启动 JavaFX 应用程序

    我创建了一个 JavaFX 应用程序 并使用以下命令创建了其本机包Ant 当我尝试使用双击创建的捆绑包中的 Jar 启动应用程序时 它成功启动了我的应用程序 但是当我尝试双击 MyApplication exe 比如说 时 它抛出JavaF
  • WPF FrameworkElement 未接收鼠标输入

    尝试让 OnMouse 事件出现在子项中FrameworkElement 父元素是一个Panel 以及Background属性不为空 class MyFrameworkElement FrameworkElement protected o
  • 不要让 IE 选择并复制使用 jQuery .hide() 隐藏的表行

    我在数据表顶部有一个 jQuery 即时搜索栏 所有符合搜索条件的记录都将可见 row show 其余的都是隐藏的 row hide Problem 搜索后 我使用鼠标从搜索结果中选择 复制行列表并将其粘贴到 Excel 中 隐藏 记录也会
  • 通过动画将视图的可见性从消失变为可见

    我有一个观点是invisible默认情况下 只是第一次 现在我需要将可见性切换为VISIBLE有了这个animation if myView getVisibility View INVISIBLE myView setVisibility
  • NullPointerException 加载 fxml

    我想在我的应用程序中加载 fxml 文件 我使用下一个代码 try FXMLLoader loader new FXMLLoader loader setController null loader setRoot null loader
  • JavaFX 中的隐形舞台/场景

    我正在寻找一种隐藏 JavaFX 舞台或场景的方法 现在我知道了 hide 但这行不通 我需要一些仍然保留窗口的东西 但只是使其完全透明 一个很好的比喻是display none and visibility hidden在CSS中 第一个
  • FXML load() 期间出现 JavaFX IllegalAccessException

    我有一个由以下代码调用的对话框窗口 DialogController是使用模式对话框窗口的辅助类 它主要将控制器引用与其窗口捆绑在一起 void handleServicesEdit ActionEvent event throws IOE
  • javafx中的stackpane和root有什么区别?

    我正在练习javafx做饼图 以下是开发饼图的代码 如果我这样做Group并与StackPane 我发现输出没有区别 我已经评论了组部分 只是徘徊两者之间的区别 import javafx application Application i
  • 如何在javafx中获取当前屏幕详细信息?

    我的电脑连接了多个显示器 从 javaFX 我可以获得主屏幕 但我需要了解当前舞台所在屏幕的屏幕详细信息 我怎样才能得到它 尝试使用获取矩形屏幕 http docs oracle com javafx 2 api javafx stage

随机推荐

  • 我什么时候知道 GeoFire 已完成加载,因为它是基于事件的触发器

    因此 我使用 GeoFire 和 AngularFire 来填充我的 ng repeat 项目列表 有一个离子拉动来刷新列表 因此 用户拉动它并获取当前更新的位置并刷新列表 调用 GeoFire 来重新填充列表 scope doRefres
  • 未捕获的类型错误:无法读取未定义的属性(读取“isBatchingLegacy”)

    我正在尝试使用 jest 测试反应打字稿项目 但它给出了一个令人困惑的错误 错误图像 https i stack imgur com gdWQp png 这是我的 package json dependencies testing libr
  • 未捕获的引用错误:谷歌未定义

    我正在尝试将 geoJSON 文件中的标记加载到我的地图上 地图加载正常 但不断出现错误 Uncaught ReferenceError google is not defined 在这一行 google maps event addDom
  • 使用Python修改INI文件

    我有一个 INI 文件需要使用 Python 进行修改 我正在调查ConfigParser模块 但仍然遇到问题 我的代码是这样的 config ConfigParser RawConfigParser config read C itb i
  • 解析,如何向目标用户发送推送通知

    我已成功设置解析推送通知 并且在我的安装表中我同时拥有安装和设备令牌 我真正想做的是将推送通知发送给某些用户 而不是某些设备 如何将安装表绑定到使用表 以便我可以由用户进行查询并返回要推送到的设备ID From https parse co
  • 如何将 Maxmind .MMDB 转换为 .DAT?

    如何将 MaxMinds MMDB GeoIP 转换为 DAT 格式 以便我可以与 modsecurity Apache 一起使用 Modsecurity 仅支持 DAT 格式 截至 2019 年 2 月 以下 Python 脚本是将 Ge
  • 任务之间的气流延迟

    As you can see in the image airflow is making too much time between tasks execution it almost represents 30 of the DAG e
  • 如何使用 Rollup 构建自定义引导程序包

    根据Bootstrap 5官方文档 我们可以从以下位置导入预编译的js文件bootstrap js dist并使用 Webpack rollup 构建自定义捆绑包 https getbootstrap com docs 5 0 gettin
  • 为什么从 UI 中删除命令源后会调用 CanExecute?

    我试图理解为什么在已从 UI 中删除的命令源上调用 CanExecute 这是一个简化的程序来演示
  • API向后兼容性的最佳实践

    我正在开发一个与 JSON API 进行通信的 iPhone iPad Android 应用程序 该应用程序版本的第一个版本已经完成 现在正在进行其他开发阶段 在其他阶段 应用程序需要与新版本的 API 集成 并允许用户访问其他功能 例如新
  • 在C中将多个值分配给数组

    有没有办法以压缩的形式做到这一点 GLfloat coordinates 8 coordinates 0 1 0f coordinates 1 0 0f coordinates 2 1 0f coordinates 3 1 0f coord
  • SSIS:如何使用链接服务器:

    我已经通过 MS SQL Server Management Studio 成功添加了链接服务器 它的名称是 SQL2 Link 当我在 SSIS 中添加一个连接作为 ADO NET 连接时 它不会显示在可用选项列表中 如何将其添加为 SS
  • hg 存档到远程目录

    有没有办法通过 SSH 将 Mercurial 存储库存档到远程目录 例如 如果可以执行以下操作 那就太好了 hg archive ssh email protected cdn cgi l email protection path to
  • Karma-webpack+Angular TypeError:未定义不是对象(评估 '$httpBackend.expectPOST'

    我收到以下错误 PhantomJS 2 1 1 Linux 0 0 0 leave API service create should create a leave FAILED static app min js 4804 54 forE
  • 在 WPF 窗口上加载多个 UserControls

    我有一个窗口 在其中加载一个用户控件 例如 Control1 现在 如果用户单击某个新的 UserControl 按钮 Control2 应该加载到窗口上 而 Control1 应该消失 同样 当用户单击下一个 UserControl 的按
  • PyTorch 中复数矩阵的行列式

    有没有办法在 PyTorch 中计算复矩阵的行列式 torch det未针对 ComplexFloat 实现 不幸的是 目前尚未实施 一种方法是实现您自己的版本或简单地使用np linalg det 这是一个简短的函数 它计算我使用 LU
  • 如何在plotly 3D曲面图中标记区域?

    我使用plotly从xyz数据创建3D高程剖面图 它与以下代码配合得很好 import plotly graph objects as go import pandas as pd import numpy as np Read data
  • PHP DOM:按标签名称获取元素

    我担心这是一个非常愚蠢的问题 但在过去两个小时尝试了大量组合后 我真的陷入了困境 我正在尝试从 XML 文件中提取 NAME 我的 XML 文件
  • numpy bincount 可以处理二维数组吗?

    我看到 numpy bincount 的行为我无法理解 我想以行方式将值存储在二维数组中 并查看下面的行为 为什么它可以与 dbArray 一起使用 但与 simarray 一起失败 gt gt gt dbArray array 1 0 1
  • JavaFX 2.2 不可见节点的鼠标事件

    我正在尝试接收 JavaFX 2 2 中不可见节点的 MouseEvents 将其视为一个交互式但不可见的区域 例如当鼠标悬停在其上时应触发操作 问题是 这不是静态定义的区域 而是有多个区域 很多 可以由应用程序移动和调整大小 因此 对于我