我正在创建一个包含许多TextFields和ComboBoxes以及CheckBoxes的视图,其值由单个Binder处理。没问题。
但是:现在我想在视图中添加3个RadioButtons,这些值应该来自同一个Binder。每个RadioButton绑定到一个不同的布尔字段,这些字段中只有一个可以同时为true(对RadioBoxes的完美要求)。
问题#1 :简单的RadioButton没有组件(就像CheckBox一样),我只能找到RadioButtonGroup。所以我想我将不得不与那个合作。
问题#2 :Vaadin Docs中明确指出:
CheckBoxGroup 组件的优点在于,它维护单个复选框对象,您可以轻松获取当前所选项目的数组,并且可以轻松更改单个的外观组件并与Binder一起使用。
但我无法找到绑定 RadioButtonGroup 项目的方法,也无法在任何地方找到它。
有没有办法绑定RadioButtonGroup中的单个项?
如果没有,那么我担心我将不得不使用CheckBoxes,其中RadioButtons将是一个更合乎逻辑的方法。
以下是一些代码,用于演示我要完成的任务:
// FooBar Class
private boolean foo = true;
private boolean bar = false;
private boolean fooBar = false;
// constructor, getters and setters
// My View
Binder<FooBar> binder = new Binder<>();
binder.setBean(new FooBar());
// this CheckBox works perfectly fine like this
Checkbox cb = new CheckBox();
cb.setCaption("Foo");
binder.forItem(cb)
.bind(f -> f.isFoo, (f, b) -> f.setFoo(b));
// this part is where I'm confused
RadioButtonGroup<String> rbg = new RadioButtonGroup<>();
rbg.setItems("Foo", "Bar", "FooBar");
// how can i bind each RadioButton to different fields of my FooBar Bean?
// because getItem() does not exist
binder.forItem(rbg.getItem(0)).bind(f -> f.isFoo, (f, b) -> f.setFoo(b));
binder.forItem(rbg.getItem(1)).bind(f -> f.isBar, (f, b) -> f.setBar(b));
binder.forItem(rbg.getItem(2)).bind(f -> f.isFooBar, (f, b) -> f.setFooBar(b));
答案 0 :(得分:3)
我建议考虑采用一种不同的方法。单选按钮通常用于为单个属性赋值 - RadioButtonGroup
是单个表单字段 - 而不是属性或字段列表,所以我猜这就是为什么找不到简单的解决方案。
如果可能,请将您的三个boolean
更改为enum
,如:
public enum RadioButtonValue {
foo, bar, foobar;
}
这应该提供兼容的功能,因为你想一次只限制三个布尔中的一个。
然后上课:
public class RadioButtonBean {
@Getter @Setter // Lombok
private RadioButtonValue radioButtonValue;
// replaces boolean foo, bar, foobar;
}
允许您轻松进行绑定:
RadioButtonGroup<RadioButtonValue> radioGroup = new RadioButtonGroup<>();
radioGroup.setCaption("Radiobutton group");
// populate with enum values as title or use setItemCaptionGenerator(...);
radioGroup.setDataProvider(
new ListDataProvider<RadioButtonValue>(
Arrays.asList( RadioButtonValue.values() )
)
);
final RadioButtonBean bean = new RadioButtonBean();
Binder<RadioButtonBean> binder = new Binder<>();
binder.setBean(bean);
binder.forField(radioGroup).bind(RadioButtonBean::getRadioButtonValue,
RadioButtonBean::setRadioButtonValue );
// uncomment for testing it
// radioGroup.addValueChangeListener( vc -> {
// Notification.show("bean enum value: "+ bean.getRadioButtonValue() );
// });
如果无法将boolean
更改为enum
,那么我认为最简单的方法是更改上述内容:
ValueChangeListener
,根据所选的枚举设置bean中相应的布尔值。