我正在用Java创建一个属性编辑器小部件。这个小部件将接受一个java bean,复制它,并动态创建一个带有swing组件的JPanel来表示该bean中的字段。我想将swing组件绑定到副本,以便在调用方法getFinishedBean()时返回副本,并将其字段设置为swing组件中设置的值。我试图通过循环遍历每个字段,确定其类型,为其创建适当的JComponent,将该组件绑定到bean副本,然后将组件添加到面板来尝试这样做。我的问题是bean的属性似乎没有受到约束。
这是绑定代码:
if((component instanceof JCheckBox))
{
JCheckBox checkBox = (JCheckBox) component;
BeanProperty<JCheckBox, Boolean> jCheckBoxBeanProperty = BeanProperty.create("selected");
BeanProperty<T, Boolean> beanProperty = BeanProperty.create(field.getName());
AutoBinding<JCheckBox, Boolean, T, Boolean> autoBinding = Bindings.createAutoBinding(
UpdateStrategy.READ,
checkBox, jCheckBoxBeanProperty, finishedBean, beanProperty);
autoBinding.bind();
builder.append(field.getName() + ":", checkBox);
}
此代码部分没有编译错误或警告,但finishBean的属性不会更改。我非常接近,我只需要将JComponents中的值输入到完成的bean中。
答案 0 :(得分:0)
正如kleopatra所述,绑定经过调整,因此应该正确绑定。
属性 selected
不能直接绑定在JCheckBox
(或从JToggleButton
延伸的任何其他组件,例如JRadioButton
),因为该属性不会在状态更改时传播。绑定会安装PropertyChangeListener
,但该组件需要ItemListener
来监听更改。
您有两种选择:
JCheckBox
发生ItemListener
时,selected
在创建时添加ItemEvent
,以触发action.selected
的属性更改;或Action
,因为与按钮itslef不同,包含的{{1}}实际上传播了属性更改,因此可以绑定。 我推荐第二个选项,因为它更清洁。