即使 newValue == oldValue 也会触发更改事件的 JavaFX ObjectProperty

标签 java inheritance javafx overriding

ObjectPropertyBasenewValue == oldValue 时跳过值失效:

/**
 * {@inheritDoc}
 */
@Override
public void set(T newValue) {
    if (isBound()) {
        throw new java.lang.RuntimeException((getBean() != null && getName() != null ?
                getBean().getClass().getSimpleName() + "." + getName() + " : ": "") + "A bound value cannot be set.");
    }
    if (value != newValue) {
        value = newValue;
        markInvalid();
    }
}

问题: markInvalid()valueprivate,因此我无法覆盖 set( newValue) 正确。

问题:如何获取一个执行(value != newValue)检查的类型?

此问题与 this question 相关.

最佳答案

How can I obtain a type, that does not do the (value != newValue) check?

扩展SimpleObjectProperty(或ObjectPropertyBase)并覆盖其set方法并跳过检查。虽然您无法自己调用 markInvalid,但该方法不会做很多您做不到的事情:

class InvalidatingObjectProperty<T> extends SimpleObjectProperty<T> {

    @Override
    public void set(T newValue) {
        if (isBound()) {
            throw new java.lang.RuntimeException(
                    (getBean() != null && getName() != null ? getBean().getClass().getSimpleName() + "." + getName() + " : " : "")
                            + "A bound value cannot be set.");
        }
        invalidated();
        fireValueChangedEvent();
    }
}

我们缺少的是将valid设置为false。但是,唯一重要的地方是其 toString 方法,您也可以重写该方法。

关于即使 newValue == oldValue 也会触发更改事件的 JavaFX ObjectProperty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45116003/

相关文章:

java - ListView 和文件选择器

java - 如何在 Javafx 中将图像添加为组合框中的选项

java - JAXWS : Why would one generate the client code within maven through jaxws-maven-plugin?

java - oracle Thin驱动程序使用哪个jar文件?

java - 使用 jna 加载 lib.so

python - 在不改变原始对象的情况下对 DataFrame 进行子类化

java - 如何添加动画以最小化 JavaFX?

java - pymemcached 缓存中的下一个唯一键

scala - 如何将 "instantiate"抽象类放在父类(super class)中?

java继承: distinguish between types of inherited classes