我正在尝试将 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/