Java 如何将泛型bean的属性绑定到动态创建的swing组件
我正在用Java制作一个属性编辑器小部件。这个小部件将接收一个javabean,复制它,并动态创建一个带有swing组件的JPanel,以表示该bean中的字段。我希望将swing组件绑定到副本,以便在调用getFinishedBean()方法时,返回副本,并将其字段设置为swing组件中设置的值。我尝试通过循环遍历每个字段、确定其类型、为其创建适当的JComponent、将该组件绑定到bean副本,然后将该组件添加到面板来实现这一点。我的问题是bean的属性似乎没有被绑定 这是绑定代码:Java 如何将泛型bean的属性绑定到动态创建的swing组件,java,swing,generics,dynamic,binding,Java,Swing,Generics,Dynamic,Binding,我正在用Java制作一个属性编辑器小部件。这个小部件将接收一个javabean,复制它,并动态创建一个带有swing组件的JPanel,以表示该bean中的字段。我希望将swing组件绑定到副本,以便在调用getFinishedBean()方法时,返回副本,并将其字段设置为swing组件中设置的值。我尝试通过循环遍历每个字段、确定其类型、为其创建适当的JComponent、将该组件绑定到bean副本,然后将该组件添加到面板来实现这一点。我的问题是bean的属性似乎没有被绑定 这是绑定代码: if
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);
}
if((JCheckBox的组件实例))
{
JCheckBox checkBox=(JCheckBox)组件;
BeanProperty jCheckBoxBeanProperty=BeanProperty.create(“选中”);
BeanProperty BeanProperty=BeanProperty.create(field.getName());
自动绑定自动绑定=绑定。创建自动绑定(
UpdateStrategy.READ,
复选框,jCheckBoxBeanProperty,finishedBean,beanProperty);
自动绑定。绑定();
append(field.getName()+“:”,复选框);
}
此代码段没有编译错误或警告,但finishedBean的属性没有更改。我非常接近,我只需要将JComponents中的值放入成品bean中。正如kleopatra所说,绑定是经过调整的,因此应该正确绑定 选定的属性
不能直接绑定到JCheckBox
(或从JToggleButton
扩展的任何其他组件,如JRadioButton
)上,因为状态更改时不会传播该属性。绑定会安装一个PropertyChangeListener
,但组件需要一个ItemListener
来监听更改
您有两个选择:
- 扩展
JCheckBox
在创建时添加一个itemstener
,当发生ItemEvent
时,该监听器为所选触发属性更改;或
- 使用bean属性
action.selected
,因为与按钮itslef不同,包含的操作实际上传播属性更改,因此可以绑定
我建议使用第二个选项,因为它更干净。问题看起来像是使用(更好的)beansbinding—如果是这样,则支持直接绑定。(B) bb在内部将itemListener调整为PropertyChangeListener假设您的绑定框架是(更好的)beansbinding:绑定本身应该可以工作我试着运行您的示例,就像Kleopatra一样,在BBB上对我来说是完美的。只需注意,运行此代码时,finishedBean初始值被重置,因为复选框被设置为源;我会使用读/写策略,将bean作为源代码。如果您试图再次检查显示面板的值,则始终会将其重置。