如何将通用bean的属性绑定到动态创建的swing组件

时间:2012-08-17 17:41:06

标签: java swing generics dynamic binding

我正在用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中。

1 个答案:

答案 0 :(得分:0)

正如kleopatra所述,绑定经过调整,因此应该正确绑定。

属性selected不能直接绑定在JCheckBox(或从JToggleButton延伸的任何其他组件,例如JRadioButton),因为该属性不会在状态更改时传播。绑定会安装PropertyChangeListener,但该组件需要ItemListener来监听更改。

您有两种选择:

  • JCheckBox发生ItemListener时,selected在创建时添加ItemEvent,以触发action.selected的属性更改;或
  • 使用bean属性Action,因为与按钮itslef不同,包含的{{1}}实际上传播了属性更改,因此可以绑定。

我推荐第二个选项,因为它更清洁。