1

我正在用 Java 制作一个属性编辑器小部件。这个小部件将接收一个 java bean,对其进行复制,然后动态地创建一个带有 swing 组件的 JPanel 来表示该 bean 中的字段。我想将摇摆组件绑定到副本,以便在调用 getFinishedBean() 方法时,返回副本,并将其字段设置为摇摆组件中设置的值。我试图通过遍历每个字段、确定其类型、为其创建适当的 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);
            }

此代码段没有编译错误或警告,但finishedBean 的属性没有改变。我非常接近,我只需要将 JComponents 中的值获取到完成的 bean 中。

4

1 回答 1

0

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

该属性selected不能直接绑定在 a JCheckBox(或任何其他从JToggleButton诸如扩展的组件JRadioButton)上,因为该属性不会在状态更改时传播。绑定安装了 aPropertyChangeListener但组件需要 aItemListener来监听更改。

你有两个选择:

  • 扩展JCheckBox创建时的添加,当发生事件时ItemListener触发属性更改;或者selectedItemEvent
  • 使用 bean 属性action.selected,因为与按钮本身不同,Action包含的实际上传播了属性更改,因此可以绑定。

我推荐第二种选择,因为它更干净。

于 2013-03-11T12:48:38.413 回答