Vaadin 8 - 如何绑定RadioButtonGroup的项目?

时间:2018-01-24 13:45:36

标签: vaadin vaadin8

我正在创建一个包含许多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));

1 个答案:

答案 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 ,那么我认为最简单的方法是更改​​上述内容:

  1. 根本不要绑定广播组。
  2. 实现ValueChangeListener,根据所选的枚举设置bean中相应的布尔值。