Java 如何将泛型bean的属性绑定到动态创建的swing组件

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

我正在用Java制作一个属性编辑器小部件。这个小部件将接收一个javabean,复制它,并动态创建一个带有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);
            }
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作为源代码。如果您试图再次检查显示面板的值,则始终会将其重置。