Java 数据绑定(bind)和自定义转换器

标签 java data-binding

我正在尝试将 AtomicBoolean 绑定(bind)到 JCheckBox 的“enabled”属性。由于 AtomicBoolean 不能替代 Boolean,因此我使用自定义转换器。但是,下面显示的转换器会导致 ClassCastException。为什么?

org.jdesktop.beansbinding.Binding binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ, isIdle, org.jdesktop.beansbinding.ObjectProperty.create(), cornerCb, org.jdesktop.beansbinding.BeanProperty.create("enabled"));
        binding.setConverter(new Converter<AtomicBoolean, Boolean>() {
            @Override
            public Boolean convertForward(AtomicBoolean value) {
                Boolean b = value.get();
                return b;
            }

            @Override
            public AtomicBoolean convertReverse(Boolean value) {
                return new AtomicBoolean(value);
            }
        });

导致异常

java.lang.ClassCastException
        at java.lang.Class.cast(Class.java:2990)
        at org.jdesktop.beansbinding.Binding.convertForward(Binding.java:1312)
        at org.jdesktop.beansbinding.Binding.getSourceValueForTarget(Binding.java:844)
        at org.jdesktop.beansbinding.Binding.refreshUnmanaged(Binding.java:1222)
        at org.jdesktop.beansbinding.Binding.refresh(Binding.java:1207)
        at org.jdesktop.beansbinding.Binding.refreshAndNotify(Binding.java:1143)
        at org.jdesktop.beansbinding.AutoBinding.bindImpl(AutoBinding.java:197)
        at org.jdesktop.beansbinding.Binding.bindUnmanaged(Binding.java:959)
        at org.jdesktop.beansbinding.Binding.bind(Binding.java:944)
        at org.jdesktop.beansbinding.BindingGroup.bind(BindingGroup.java:143)

最佳答案

该异常不是来自您的代码。它发生在这里:

private final TV convertForward(SV value) {
    if (converter == null) {
        Class<?> targetType = noPrimitiveType(targetProperty.getWriteType(targetObject));
        return (TV)targetType.cast(Converter.defaultConvert(value, targetType));
    }

    return converter.convertForward(value);
}

有几个不同的 Maven 工件都包含该类,并在第 1312 行调用 Class.cast()。您使用哪个并不重要。您可能需要进行一些调试。在该行上放置一个断点,然后您可以跟踪回调并查看正在传递哪些值以及发生异常的原因。看来您的转换器由于某种原因没有被使用,这可能就是问题所在。它可能正在尝试将 AtomicBoolean 转换为 Boolean。

关于Java 数据绑定(bind)和自定义转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6770677/

相关文章:

带有用户控件的 WPF 数据绑定(bind)

asp.net - 我应该使用哪个属性或方法将 ToolTip 属性绑定(bind)到 ImageField 类?

java - 仅当抛出运行时异常时未找到线程绑定(bind)请求

java - 为 RunningTaskInfo 设置唯一标识符

java - 如何在不覆盖compareTo的情况下按对象的hashmap中的键排序?

java - 如何像在 Netbeans IDE 中一样在 Emacs 中自动格式化代码

Android资源链接在绑定(bind)适配器数据绑定(bind)中失败

android - 如何使用android数据绑定(bind)来绑定(bind)接口(interface)?

javascript - javascript 中 soundcloud 的当前时间和持续时间

java - Netbeans Cordova 构建失败错误 1 ​​: The SDK Build Tools revision (19. 0.3) 对于项目来说太低