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 不可见节点的鼠标事件 的相关文章

  • 如何让greasemonkey在新标签中一一打开大量链接?

    有一些链接与上面类似 gt td a href http Lucifase com pages 2000 php refid 2000 target blank gt 2000 a br td td a href http Lucifase
  • JavaFX XYChart 对数图

    我有一个 XYChart 将数据绘制为 Y 轴上的线性步骤 我想绘制为对数或半对数 Y 刻度 如何更改我的以下代码 public class BaseXYChart extends Application Override public v
  • 阻止 robots.mouseMove 生成​​ MouseEvent?

    我有一个 3D 游戏 每次移动光标时 我希望它重置到中间 问题是 robots mouseMove 调用 MouseEvent 它确实有意义 并重置位置 所以我无法旋转 谢谢你 我更喜欢如下代码 component removeMouseL
  • 如何在 fxml 项目中使用 font Awesome (javafx)

    我想在我的项目中使用 font Awesome 字体 但我不知道如何在我的项目中使用 font Awesome 我找到了一些示例 但它们不能在 fxml 中使用 很棒的javafx字体 https bitbucket org Jerady
  • 按类 ID 隐藏 div

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

    我正在使用 Shiny 应用程序 其中可能需要一些时间才能将滑块设置为正确的值 因此 在尝试将滑块设置为正确的值 并且不释放鼠标左键 时 即我的本地 服务器观察到几个新值并做出相应反应 由于我的服务器对任何新值的响应可能需要几秒钟 如果我可
  • SetCursorPos 无法通过远程桌面工作(从 WM_INPUT 事件读取)

    当读取鼠标位置时WM INPUT事件 并且鼠标光标被隐藏 看起来SetCursorPos通过远程桌面使用该应用程序时不起作用 当应用程序不通过远程桌面使用时 相同的代码可以正常工作 即我可以在所有方向上进行无限的鼠标移动 因为SetCurs
  • 更改列表视图中文本视图的可见性

    我有一个列表视图 它由来自单独布局文件的两个文本视图组成 我用一个BaseAdapter从 JSON 文件构建列表 我希望第一个文本视图 标题 可单击 如果单击它会显示第二个文本视图 文本 如果再次单击它会隐藏它 当我使用onClick a
  • ruby - 文件私有方法

    在ruby中 有没有办法定义一个方法 该方法对文件 或模块 中的每个类都可见 但对需要该文件的文件不可见 相关 但不完全相同 我们可以重新定义一个方法 例如标准库的类中的方法 以便此重新定义仅在当前文件中可见吗 所有其他文件应查看原始定义
  • mousemove 事件是否每帧触发一次?

    In this 小提琴演示 https jsfiddle net JoeZheng uy9poL1j 按下并移动鼠标会根据鼠标的位置绘制点 绘制方法是听mousemove回调 但它绘制了离散点 表明mousemove事件不会连续触发 更重要
  • 如何在 Eclipse 中使用 JavaFX 2 SDK?

    我已经安装了 JavaFX 2 0 SDK 现在我想使用 Eclipse 制作一个 JavaFX 应用程序 但我该如何使用javafx Eclipse 中的类 The 官方 JavaFX Eclipse 插件 http docs oracl
  • 如何在列表视图中显示图像

    我正在使用JavaFX2 0 我需要在列表视图中显示缩略图 我编写的代码如下 ObservableList
  • JS专用鼠标按键

    我的鼠标侧面有两个按钮 其默认行为是 后退 和 前进 我想知道的是是否可以在 JavaScript 中检测这些鼠标按钮的点击 或者这些按钮是否是类似于键盘的 播放 音量调高 和 无线开 关 的 特殊 按钮纽扣 我不知道任何特定的鼠标事件 但
  • OpenCV 2.3 与 VS 2008 - 鼠标事件

    强制性 我是新手 有一份涉及编程的工作 并且我一边工作一边自学 不用说 作为一名老师 我经常犯彻底的错误 我现在所处的位置 我创建了 Graph 类 它 令人惊讶的是 制作了图表 但现在我想通过单击鼠标来修改图形 但我似乎无法让鼠标处理程序
  • JavaFX 图像未在舞台中显示

    我尝试了很多次 尝试了很多方法 但都无法让自己的形象在舞台上如我所愿 我认为这可能与java寻找资源的路径有关 但我不确定 因为我刚刚开始使用视觉库 在本例中为JavaFX 这是我的目录结构 MyProject assets img myI
  • 我们可以像 swing JSplitPane 一样在 Javafx SplitPane 上添加 OneTouchExpansable 按钮吗

    我可以在 JavaFX 上使用 css java api 库添加 OneTouchExpandable 按钮吗SplitPane Swing 中已经存在此选项JSplitPane 但我在 JavaFX API 上找不到该选项 我想 我们可以
  • MouseDoubleClick 事件不会冒泡

    我的场景经过简化 我有一个包含员工行的 ListView 在每个员工行中 都有 增加 和 减少 按钮来调整他的工资 假设在我的程序中 双击 员工 行意味着 解雇此人 The problem是当我快速单击 增加 时 这会触发 ListView
  • 如何监听场景图节点中的WindowEvent.WINDOW_SHOWN?

    似乎 WindowEvent WINDOW SHOWN 永远不会在场景图中的任何节点上分派 也没有 我能找到的 知道节点何时可见 渲染 显示 例如 测试启动器 java package com example javafx event im
  • 如何获取JavaFX的版本号?

    如何在运行时找出我正在使用哪个版本的 JavaFX 简单的方法之一就是简单地阅读javafx properties文件位于您的 JAVA HOME jre lib目录 我现在安装了 Java 1 7 u9 与之捆绑的 JavaFX 是 v2
  • JavaFX - setVisible 隐藏元素但不重新排列相邻节点

    在 JavaFX 中 如果我有一个场景有 2VBox元素和每个VBox有多个Label in it 如果我设置顶部VBox to 无形的 为什么底部VBox 不向上移动顶部的场景VBox was The VBox is 无形的但我希望其他物

随机推荐

  • 我什么时候知道 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 将其视为一个交互式但不可见的区域 例如当鼠标悬停在其上时应触发操作 问题是 这不是静态定义的区域 而是有多个区域 很多 可以由应用程序移动和调整大小 因此 对于我