- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我只关心属性是否已更改,而不是新值。
注册 InvalidationListener
而不是 ChangeListener
是否有利?
我假设对属性的更改首先会使该属性无效并通知所有无效监听器。仅当注册了更改监听器或有人请求此属性时,该属性才会“验证”/重新计算,并且所有更改监听器都会使用新值进行更新。
由于我对实际值不感兴趣,因此我认为仅监听失效事件(属性已更改但未重新计算,某种中间状态)具有性能优势。
最佳答案
您需要为此实现一个 ChangeListener
。 InvalidationListener
仅在值变得无效时执行。请参阅docs .
来自ObservableValue的java文档:
An ObservableValue generates two types of events: change events and invalidation events. A change event indicates that the value has changed. An invalidation event is generated, if the current value is not valid anymore. This distinction becomes important, if the ObservableValue supports lazy evaluation, because for a lazily evaluated value one does not know if an invalid value really has changed until it is recomputed. For this reason, generating change events requires eager evaluation while invalidation events can be generated for eager and lazy implementations.
我添加了一个简单的示例
public static void main(String[] args) {
SimpleIntegerProperty one = new SimpleIntegerProperty(1);
SimpleIntegerProperty two = new SimpleIntegerProperty(0);
// the binding we are interested in
NumberBinding sum = one.add(two);
sum.addListener(observable -> System.out.println("invalidated"));
// if you add a value change listener, the value will NOT be evaluated lazy anymore
//sum.addListener((observable, oldValue, newValue) -> System.out.println("value changed from " + oldValue + " to " + newValue));
// is valid, since nothing changed so far
System.out.println("sum valid: " + sum.isValid());
// will invalidate the sum binding
two.set(1);
one.set(2); // invalidation event NOT fired here!
System.out.println("sum valid: " + sum.isValid());
// will validate the sum binding, since it is calculated lazy when getting the value
System.out.println("sum: " + sum.getValue());
System.out.println("sum valid: " + sum.isValid());
}
使用InvalidationListener
的问题是,如果值再次无效,您将不会收到更改通知,因为它已经无效。您必须为此使用更改监听器。
在属性上注册更改监听器将禁用延迟计算,因此每次更改监听器被触发时都会触发失效事件。
在我添加的示例中尝试一下。
关于JavaFX InvalidationListener 或 ChangeListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45117076/
我想添加到属性监听器,等待此监听器被调用并删除此监听器。所以我写了下面的代码: ChangeListener listener = (observable, oldValue, newValu
我正在学习更改监听器,并想了解为什么我的部分代码在用户移动 slider 时没有触发更改监听器。 这里是听者。一切都在同一个方法中: ChangeListener lst = new ChangeLi
假设我们有一个带有 fx:include 的根窗口: startwindow.fxml的代码: 单击按钮将窗口更改为新窗口。它的 Controller ,StartW
当我编码时,我添加了以下代码: nameComboBox.valueProperty().addListener(new ChangeListener() { @Override
代码如下: package sample; import javafx.beans.InvalidationListener; import javafx.beans.Observable; impo
我想概括以下模式: setChangeListener = c -> { try { // do something dangerous } catch (final IOEx
我在 slider 上有一个简单的更改监听器。任何人都可以解释为什么当我点击一个新位置时它被解雇了 3 次。在我编写代码将先前的值保存在某处以查看它是否真的改变之前,我想看看是否有另一种方法可以弄清楚
我对 Java 很陌生,在仔细研究文档后,我发现自己陷入了困境。 我有一个小程序,使用 JavaFX MediaPlayer播放 wav 文件。我的播放器对象有一个 currentTimeProper
我有一个 JavaFX 应用程序,其中有一个并发任务。当任务运行时,我想将来自 updateMessage() 的消息附加到 TextArea 因为绑定(bind)不会将新文本附加到 TextArea
场景: 我有一个容器对象,它包含所有继承自 MyContainedObject 类的混合对象。容器类的消费者不能直接访问包含的对象,但我有兴趣知道它们何时发生变化。 设计决策: 监听特定类类型的 Ch
我试图从官方文档的“通知”部分了解 Realm 中的通知类型,当我在多个托管对象中使用 RealmObject addChangeListener 时,只有一个对象发生变化时,所有这些通知类型都会被调
我需要检测所选标签何时发生变化,并获取其索引。 以下代码有效,但它触发 println 的次数与当前加载的选项卡数量一样多: tabbedPane.addChangeListener(new Chan
在我的 JavaFX 应用程序中,我在 TreeView 中使用 Checkboxes 来更改节点的可见性。 选中复选框 = 一些节点可见 取消选中复选框 = 一些节点不可见 但是,在特殊情况下,应该
我只关心属性是否已更改,而不是新值。 注册 InvalidationListener 而不是 ChangeListener 是否有利? 我假设对属性的更改首先会使该属性无效并通知所有无效监听器。仅当注
我不知道为什么会收到警告“来自类型 new ChangeListener(){} 的方法 tabChanged(ChangeEvent) 从未在本地使用” private void setUpTabb
我正在寻找代码中的功能,以便我可以在几秒钟内输入完整内容simpleTextField 中的名称,我需要它,因为如果我输入例如: 我输入 R - 然后方法改变正在执行它的任务 我输入 RR - 然后方
我确实有一个由多个可观察的 SimpleDoubleProperty 组成的模型,我现在有一个程序,它根据可观察属性的变化运行一个函数。 我现在有一个函数calculateThings,它会在变化时被
如何打印顶部的JLabel? import java.awt.BorderLayout; import java.awt.EventQueue; import javax.swing.JFrame;
我在舞台上添加了一个表,但无法获得点击监听器来触发它: Table table = new Table(); table.setX(0); table.setY(0); table.setWidth(
我希望 ObservableList 中有一个粗体的标题。我将其设置为粗体,但在选择它时会遇到异常 block ,因为它不是字符串。我可以将其他项目设为文本,但 ChangeListener 需要一个
我是一名优秀的程序员,十分优秀!