当前位置: 首页 > 面试题库 >

JavaFX InvalidationListener或ChangeListener

曹旭
2023-03-14
问题内容

我只对属性是否已更改感兴趣,而对新值不感兴趣。

注册一个InvalidationListener而不是一个注册是否有利ChangeListener

我以为对属性的更改会首先使该属性无效并通知所有失效侦听器。仅当已注册更改侦听器或有人请求此属性时,该属性才会被“验证”
/重新计算,并且所有更改侦听器都将使用新值进行更新。

由于我对实际值不感兴趣,因此我认为仅侦听无效事件(属性已更改但未重新计算,是某种中间状态)具有性能优势。


问题答案:

您需要为此实现一个ChangeListenerInvalidationListener仅当值变为无效时才执行A。请参阅文档。

从ObservableValue的Java文档中:

ObservableValue生成两种类型的事件:更改事件和无效事件。更改事件表示该值已更改。如果当前值不再有效,则会生成一个无效事件。如果ObservableValue支持延迟求值,则这一区别就变得很重要,因为对于延迟求值的值,直到重新计算无效值,才知道该值是否真的发生了变化。
因此,生成更改事件需要进行急切的评估, 而对于急切和懒惰的实现可以生成无效事件。

我添加了一个简单的例子

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是, 如果该值再次变为无效则不会通知您更改
,因为该值已经无效。您必须为此使用更改侦听器。

在属性上注册更改侦听器 将禁用延迟评估 ,因此,每次触发更改侦听器时都会触发无效事件。

在我添加的示例中尝试一下。



 类似资料:
  • 问题内容: 定义简单单击JButton的行为时,哪种方法正确?而且,有什么区别? 要么 问题答案: 是Swing中的低级事件侦听器(顺便说一下,也是AWT)。 是更高级别的,应该使用。 比起更好的选择,应该使用(实际上是)。 使用允许在多个小部件(例如,…)之间共享它;您不仅可以共享按下按钮/菜单时触发的代码,还可以共享状态,尤其是可以共享操作(及其关联的小部件)是否处于启用状态。

  • 连接的多个输入有一个为Yes则输出Yes。 用法 Your browser does not support the video tag. 案例:小闹钟 功能:逢15就猫叫 工作原理 当输入为“yes”时,“或”节点为“yes”。 例如:一种报警装置,当被暴露在光强下(光强大于30),或者被移动(陀螺仪被震动)时报警。 请注意上面的程序等于: 提示 事实上,你不需要经常使用“或”节点,因为“或”逻

  • 我正在使用Primeface 3.4.2。 我的JSF页面中有以下内容 在ManagedBean中 问题是没有触发valueChangeListener,即没有调用handleChange方法。我尝试了以下方法,但也不起作用。 单独的JSF页面:

  • 下面是代码的味道:https://scastie.scala-lang.org/bQMGrAKgRoOFaK1lwCy04g 我有两个JSON APIendpoint。首先是项目。cgi以以下格式返回项目对象列表 表示项目没有借款人。 其次,用户。cgi,返回查询参数id指定的用户 API可能不好,但我必须处理它。现在在Scala中,我想使用这个漂亮的数据模型 我还有以下用于执行HTTP请求的方法

  • AspectJ意味着它的另一个AOP实现不是基于spring的,如果我们想使用它,那么除了spring之外,我们还需要包括一些第三方JAR。 Spring AOP注释意味着Spring使用AspectJ注释来提供AOP特性。 这些假设公平吗?

  • 问题内容: 我目前正在使用“设置”结构使用Redis。 我想知道是否有可能自动清理空的“ set”吗? 否则找到一个cron /进程来定期清理空的“ set” 更新: 更笼统的问题是,“(nil)”和“(空列表或集合)”之间存在差异(内存使用情况) 例: 要么 问题答案: 这已经是自动的。如果集合为空,则将其从名称空间中删除。 您不必执行任何特定操作即可从此行为中受益。 要回答第二个问题,(nil