当前位置: 首页 > 知识库问答 >
问题:

如何使JavaFX属性监听器在oldVaule和newValue相同的情况下激发事件?

田翔
2023-03-14

让我们考虑一个示例代码:

SimpleIntegerProperty simpleIntegerProperty = new SimpleIntegerProperty(0);
simpleIntegerProperty.addListener((observable, oldValue, newValue) -> {
  // execution code when the event is fired.
});

当我使用setvalue()方法设置新值时,如果oldValue和newValue相同,则不会激发事件。只有当他们不同的时候。

一个例子:

  • 我有一个listview 与包含一些“元素”的ObservableList 绑定。
  • 我可以在应用程序的不同位置添加更多元素。
  • 有一个启动过程的按钮“start”-它通过列表迭代并对每个元素执行一些操作。
  • 过程是不同的类。它处理一些元素,还包含SimpleIntegerPorperty-CurrentlyChosenElementIndex来指示当前选择的元素的索引

当执行当前元素时,我希望listview显示这一点。现在,在这个过程中,GUI被阻止,并且在listview上选择当前元素,同时继续执行。过程结束后,应用程序将CurrentlyChosenElementIndex重置为零,这是一个带有我有我的问题的索引。当过程开始时,第一个元素没有被选中,因为应用程序setvalue()与前面的元素相同。

有什么办法可以改变吗?

共有1个答案

慕容明煦
2023-03-14

仅使用SimpleIntegerProperty类不能做到这一点。但是您可以扩展类并添加所需的功能。创建一个类,如下所示

public class NotifySetIntegerProperty extends SimpleIntegerProperty {
    private OnSetValueListener valueListener;

    public NotifySetIntegerProperty(int initialValue) {
        super(initialValue);
    }

    @Override
    public void set(int newValue) {
        super.set(newValue);
        if(valueListener!= null) {
            valueListener.onValueSet(newValue);
        }
    }

    public void setValueListener(OnSetValueListener valueListener) {
        this.valueListener = valueListener;
    }

    public interface OnSetValueListener {
        void onValueSet(int value);
    }
}

然后可以使用它,并在调用setvalueset方法时得到通知

NotifySetIntegerProperty property = new NotifySetIntegerProperty(0);
property.setValueListener(new NotifySetIntegerProperty.OnSetValueListener() {
    @Override
    public void onValueSet(int value) {
        System.out.println(value);
    }
});
property.setValue(1);
property.setValue(0);

将输出

1
0
 类似资料:
  • 跳过值无效时: 问题:和是,因此无法正确重写。 问题:如何获得不执行检查的类型? 这个问题和这个问题有关。

  • 我做错什么了吗? 我所看到的例子是使用这种方法而不使用fxml,我必须使用注释来定义处理程序吗?在FXML中,我应该把场景的“onAction”放在哪里?

  • 有一个行为我找不到相关的留档。让我们假设以下代码。它应该在控制台中显示使用foo.bar属性配置的内容: 如果您在application.yml()中设置了以下属性,它将被正确地拾取并在控制台中显示“fromapplication.yml”,没什么花哨的 现在,如果您使用完全相同的代码,但这次您想使用命令行参数覆盖application.yml中定义的属性,并将--设置为命令行arg(请注意,这次

  • 监听事件 事件处理是在节点(cc.Node)中完成的。对于组件,可以通过访问节点 this.node 来注册和监听事件。监听事件可以通过 this.node.on() 函数来注册,方法如下: cc.Class({ extends: cc.Component, properties: { }, onLoad: function () { this.node.on('mou

  • 问题内容: 我想对窗体的大小调整事件(或其他任何事件)执行一些功能。 但是如何检测JavaFX中表单的大小调整事件? 问题答案: 你可以听的变化及的: 注意: 要侦听宽度和高度的变化,可以非常简单地使用同一侦听器: