检测节点在场景中何时可见

2024-02-29

我正在尝试找到一种方法来检测(或接收通知)节点已添加到场景中并且可见。

我正在主 JavaFx 线程中创建 Node 对象,并将它们添加到舞台和场景中,使用Platform.runLater()。但是,我希望 Node 对象接收已添加到场景中并且可见的通知,例如我希望触发动画开始。

我似乎找不到任何属性或方法来添加侦听器来捕获此类事件。有什么建议么?


第三方 JavaFX 库ReactFX https://github.com/TomasMikula/ReactFX有一个机制,这个确切的用例在blog http://tomasmikula.github.io/blog/2015/02/10/val-a-better-observablevalue.html。简而言之,你可以做

Val<Boolean> showing = Val.flatMap(node.sceneProperty(), Scene::windowProperty)
    .flatMap(Window::showingProperty);

然后当然

showing.addListener((obs, wasShowing, isNowShowing) -> {
    if (isNowShowing) {
        // node is showing
    } else {
        // node is not showing
    }
});

标准库有一个这样的版本,但写得非常糟糕。 (它不是类型安全的,没有编译时检查属性是否存在,并且如果“链”中的任何属性为空,也会将许多不必要的警告传递给标准错误,即使 API 文档表明这是一个支持的用例。)如果您想使用标准 JavaFX 库来执行此操作,您可以这样做

BooleanBinding showing = Bindings.selectBoolean(node.sceneProperty(), "window", "showing");

然后以与上面相同的方式使用绑定。

最后,您可以手动完成所有这些操作,但正确管理侦听器会有点难看:

BooleanProperty showing = new SimpleBooleanProperty();

ChangeListener<Window> windowListener = (obs, oldWindow, newWindow) -> {
    showing.unbind();
    if (newWindow != null) {
        showing.bind(newWindow.showingProperty());
    } else {
        showing.set(false);
    }
};

ChangeListener sceneListener = (obs, oldScene, newScene) -> {
    showing.unbind();
    if (oldScene != null) {
        oldScene.windowProperty().removeListener(windowListener);
    }
    if (newScene == null) {
        showing.set(false);
    } else {
        newScene.windowProperty().addListener(windowListener);
        if (newScene.getWindow() == null) {
            showing.set(false);
        } else {
            showing.bind(newScene.getWindow().showingProperty());
        }
    }
};

node.sceneProperty().addListener(sceneListener);
if (node.getScene() == null) {
    showing.set(false);
} else {
    node.getScene().windowProperty().add(windowListener);
    if (node.getScene().getWindow() == null) {
        showing.set(false);
    } else {
        showing.bind(node.getScene().getWindow().showingProperty());
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检测节点在场景中何时可见 的相关文章

  • 如何在 JavaFX 中将 FontAwesome 升级到版本 5

    我有一个使用 FontAwesome 图标的 JavaFX 我想使用新版本 5 但似乎已经不起作用了 这是一个用 Groovy 编写的简单演示应用程序 可与旧版 FontAwesome 一起使用 import javafx applicat
  • JavaFX 中的 fx:id 和 id: 有什么区别?

    也许是一个真正的新手的问题 我开始通过阅读以下教程在 FMXL 应用程序中使用场景生成器学习 JavaFX http docs oracle com javase 8 javafx get started tutorial fxml tut
  • 即使在轴上进行自动量程调整,我也可以保留积分刻度线吗?

    我 偷 了一些代码here http fxexperience com 2012 01 curve fitting and styling areachart 拥有一个AreaChart我在 FXML 中使用了 平滑线条 它的工作原理如下
  • JavaFX使节点覆盖父节点边框颜色

    我有一个如下所示的节点 仅使用 css 我希望标签覆盖其父边框颜色 因此标签下方的边框颜色部分变得不可见 我用来制作这个边框的CSS代码 fx border color black fx border width 3 fx border r
  • 如何从 JavaFX 中的另一个控制器类访问 UI 元素?

    我有一个使用 NetBeans 8 编写的 JavaFX Java 8 应用程序 没有SceneBuilder 我的应用程序有一个主窗口 该窗口有自己的 FXML 文件 primary fxml 和自己的控制器类 FXMLPrimaryCo
  • Javafx 从 TextField 获取输入

    这是我当前的代码 它所做的只是为我制作的计算器设置一个 GUI 界面 我希望用户输入两个值 然后当按下 Sum 按钮时 它将两个值加在一起并将其显示在 Sum 文本字段中 我正在尝试使用 JavaFX 如果您能提供一些帮助 我将不胜感激 i
  • 我们可以像 swing JSplitPane 一样在 Javafx SplitPane 上添加 OneTouchExpansable 按钮吗

    我可以在 JavaFX 上使用 css java api 库添加 OneTouchExpandable 按钮吗SplitPane Swing 中已经存在此选项JSplitPane 但我在 JavaFX API 上找不到该选项 我想 我们可以
  • 在 JavaFX 中拖动未装饰的舞台

    我希望将舞台设置为 未装饰 使其可拖动且可最小化 问题是我找不到这样做的方法 因为我遇到的示例是通过插入到主方法中的方法来实现的 我想通过控制器类中声明的方法来完成此操作 就像我如何使用下面的 WindowClose 方法来完成此操作 这是
  • 复选框选择与 TableView 绑定

    How to bind with TableView selection model with checkbox isSelected in table view In manually using mouse multiple selec
  • JavaFX 动画使用循环?

    我正在尝试制作一款类似太空侵略者的游戏 我画了一个正方形 我想通过使用循环逐步向下移动它thread sleep 然而 正方形立即被绘制出来 我知道有可以使用的动画路径 但我想保持低水平并仅使用坐标系 有没有办法使用这样的循环来制作时间轴动
  • JavaFX 8 默认消息图标

    随着 JavaFX 的最近几次更新 我们收到了警报 我想获取消息的默认图标 错误 警告 在Swing中 我可以通过一些方式获取L F消息图标UIManager的属性 如何在 JavaFX 中获取消息的默认图标 它们是包含在属性中 还是由 C
  • 从 IntelliJ 运行 JavaFX 应用程序

    Versions openjdk版本 11 0 11 2021 04 20 OpenJDK 运行时环境 build 11 0 11 9 Ubuntu 0ubuntu2 20 10 OpenJDK 64 位服务器虚拟机 内部版本 11 0 1
  • 在 JavaFX 中更改 ListView 字体大小

    我想知道如何更改 JavaFx 中的列表视图项目文本字体大小 每行文本的大小会有所不同 我尝试使用细胞因子属性 但我不知道如何使用它 有人可以帮我吗 类似的问题在这里 如何更改JavaFX中ListView的字体大小 https stack
  • JavaFX 打印自定义纸张尺寸

    在 JavaFX 中 我想将照片打印到 10x15 的纸张上 有一些纸张常数 但没有 100x150 mm 常数 是否可以创建自己的纸张以在页面布局中使用它 Thanks PageLayout pageLayout printer crea
  • 如何解决 onEditCommit 事件上的类型不匹配错误?

    我在 Fxml 中使用 onEditCommit 事件在用户编辑数据后检索数据 FXML 代码
  • JavaFX 模块对于 VM 不可见

    我使用 Intellij Idea 作为我的 IDE 由于我需要使用 css 文件 因此我安装了 Intellij Ultimate 现在 javaFx 不适用于它们 抛出异常 boot层初始化时出错 java lang module Fi
  • 更改JavaFX TableView字体大小[重复]

    这个问题在这里已经有答案了 您好 我想在表视图列内的文本上设置字体 我如何用 Java 做到这一点 这是我的代码 感谢帮助 private final TableView
  • 如何将 CSS 样式表附加到 FXML?

    遵循 Oracle 教程http docs oracle com javafx 2 get started fxml tutorial htm http docs oracle com javafx 2 get started fxml t
  • JavaFX 可以在 Android 上运行吗?

    如果不这样做那就太可惜了 因为这将使 Android 应用程序看起来更有吸引力 现在还不行 要让它发挥作用将是一项艰巨的任务 Android 不具备典型桌面 JRE 所具备的所有库 尽管Android是开源的并且它会运行任何可以编译为Dal
  • JavaFX 多线程 - 连接线程不会更新 UI

    我正在尝试创建一个加载程序对话框 用户可以在其中知道程序正在加载所请求的内容并且程序正在按预期运行 但正因为如此 我需要join 解析器线程和之前继续主线程 这使得对话框空白 解析器任务 java public class ParserTa

随机推荐

  • 从 github 构建 R 包:如何禁用构建小插图?

    我尝试建立R 包的分支 https github com patcpsc rredis来自github 这个fork有一个新的错误修复 https github com bwlewis doRedis issues 10 不幸的是 在尝试构
  • 在测试期间注入@Autowired私有字段

    我有一个组件设置 本质上是应用程序的启动器 它的配置如下 Component public class MyLauncher Autowired MyService myService other methods MyService 注释为
  • 在编译时获取 std::array 中的元素数量

    以下是有效的 C 代码吗 为什么不呢 std array
  • Go 语法和接口作为函数的参数

    我是Go编程语言的新手 最近遇到以下代码 func rec ContactRecord Less other interface bool return rec sortKey Less other ContactRecord sortKe
  • 在c#中自定义ToolStripMenuItems

    我需要在我的应用程序中自定义 ToolStripMenuItems 每个打开子菜单的 ToolStripMenuItem 的文本附近都有一个黑色箭头 我想更改一些颜色 MenuItemSelected MenuItemBorder Menu
  • JavaScript 中仅比较日期部分而不比较时间

    下面的代码有什么问题 也许只比较日期而不是时间会更简单 我也不知道如何做到这一点 我进行了搜索 但找不到我的确切问题 顺便说一句 当我在警报中显示两个日期时 它们显示为完全相同 My code window addEvent domread
  • System.Data.DataException:初始化数据库时发生异常

    请帮我解决这个问题 我已经编写了使用 LINQ 从数据库获取第一条记录的代码 My Homecontroler CustomHandleError public class HomeController Controller Domain
  • 如何动态生成团队之间可能的遭遇?

    我感谢您提前在本练习中提供帮助 其中我还没有发现如何解决它的真相 如何动态生成团队之间可能的遭遇 具有以下输入字段 开始日期 teams fields 玩的天数 例如以下数据 const startDate 03 08 2020 const
  • MySQL - 连接上的特定列?

    在进行连接 内部 左外部 右外部或其他 时 如何指定表中的哪些列要连接到原始表中 考虑以下示例 SELECT FirstName FROM User LEFT OUTER JOIN Provider ON User ProviderID P
  • 谁能量化 C++ 和 Java 之间的性能差异?

    在 JIT 出现之前 Java 最初速度很慢 但现在的性能非常接近 C 我想知道是否有人对这两种语言进行了可衡量的性能比较 与C 相比 Java的不足在哪里 Java 为开发人员提供了许多生产力提升 因此他们可以更快地编写应用程序 因为没有
  • Mockito:使用类型兼容的参数验证重载方法

    考虑你想要mock一个接口使用Mockito包含以下方法签名 public void doThis Object o public void doThis Object o 我需要verify that doThis Object o 而不
  • 当仪表板按钮被禁用时,我们可以显示不同的工具提示吗?

    我专门使用 Tridion 2011 的 PowerTools 扩展 但这适用于仪表板中带有按钮的任何 Anguilla 扩展 我们可以设置
  • getElementById() 高效吗? [复制]

    这个问题在这里已经有答案了 我经常用这个方法getElementById id1 在我的方法中 我用它来查找 HTML 中的某些元素 我想知道如果每次都必须搜索整个 DOM 我是否需要关心我使用它的程度 这个方法如何运作 它是否解析 DOM
  • 创建具有大量标志的位标志变量或如何创建大位宽数字

    假设我有一个枚举 其位标志选项大于标准数据类型中的位数 enum flag t FLAG 1 0x1 FLAG 2 0x2 FLAG 130 0x400000000000000000000000000000000 由于多种原因 这是不可能的
  • 如何检查字符串是否与 Python 中的设定模式匹配?

    我想将字符串与特定模式或单词集匹配 如下所示 the apple is red是查询并且the apple orange grape is red orange violet是要匹配的模式 这些管道代表可以相互替换的单词 该模式也可以分组为
  • 如何检索单元格评论的文本

    我找到了很多用于创建的示例 但没有找到用于检索单元格注释文本的示例 我错过了一些明显的事情吗 Range Comment Text似乎在这里工作没有任何问题 e g if not ActiveCell Comment is nothing
  • RestKit 不会从本地存储中删除孤立对象

    您好 我已将 RestKit 从 0 10 2 更新到 0 20 3 现在更新后 当 Web 服务中缺少对象时 RestKit 不会从本地存储中删除它们 我知道 RestKit 0 20 x 支持它 但我无法配置它 我按照这里给出的例子进行
  • 如何通过其值而不是位置设置微调器默认值?

    我的数据库中有 1 50 条记录 我使用游标获取这些数据 并使用简单游标适配器将这些值设置为 Spinner 现在我需要的是我想设置一个值 例如第 39 个值 作为默认值 但我不想通过它的位置来设置它的值 我知道如何通过其位置设置微调器默认
  • 在Centos 6.6 64位中安装pymssql

    我尝试在 Centos 6 6 中 pip install pymssql 但不断遇到此错误 mssql c 314 22 错误 sqlfront h 没有这样的文件或目录 cpp helpers h 34 19 错误 sybdb h 没有
  • 检测节点在场景中何时可见

    我正在尝试找到一种方法来检测 或接收通知 节点已添加到场景中并且可见 我正在主 JavaFx 线程中创建 Node 对象 并将它们添加到舞台和场景中 使用Platform runLater 但是 我希望 Node 对象接收已添加到场景中并且