我有一个vaadin UI,该UI必须是动态的(字段的可见性应根据用户选择而改变)。我尝试了各种修改组件状态的方法,例如setEnabled(),setLabel(),...
我有一个ComboBox,用户可以在其中从Enum中选择值。我在ComboBox中添加了一个ValueChangeListener,在其中尝试修改某些TextFields的Labels和其他属性(setLabel(),setEnabled()等)。
我的ComboBox具有这样的ValueChangeListener:
myComboBox.addValueChangeListener(event -> refreshLabels(event.getValue()));
首先,我编写了这样的方法:
private void refreshLabels(MyEnum e){
switch(e){
case OPTION1: textField1.setLabel("some Text");
textField2.setLabel("some Text");
case OPTION2: textField1.setLabel("some other Text");
textField2.setLabel("some other Text");
}
}
但是使用这种方法,标签将不会更新。
然后,我编写了另一个更新标签的过程:
private String getNewLabel(MyEnum e){
switch(e){
case OPTION1: return "some Text";
case OPTION2: return "some other Text";
default: return "";
}
}
我还更改了ComboBox的ValueChangeListener:
myComboBox.addValueChangeListener(event -> textField1.setLabel(getNewLabel(event.getValue())));
使用此代码,我的标签会更新。
如您所见,我有一个解决方法,但有了此解决方法,我必须为每个Field编写一个getNeLabel方法,因为在更新ComboBox时,所有字段都将需要不同的Labels。我不明白,为什么我的第一种方法行不通,而第二种方法行得通。在这两种情况下,更改标签后,组件都已添加到布局中并显示在UI上。有人可以向我解释一下吗?
答案 0 :(得分:3)
实际上,您的第一种方法没有任何问题,组合框应正确地switch
块中的代码段中。您忘记在此处添加break;
。因此,如果存在任何匹配项,则值始终设置为second(last)选项。 (在第二种情况下,您要通过从方法返回来终止switch
的执行,因此该方法在那里起作用)
每个break语句终止封闭的switch语句。控制流从切换块后的第一条语句继续。 break语句是必需的,因为没有它们,开关块中的语句会掉入:匹配case标签之后的所有语句将按顺序执行,而不管后续case标签的表达如何,直到遇到break语句为止。
这对我正确:
TextField textField1 = new TextField("first");
TextField textField2 = new TextField("second");
//Some method here
ComboBox<MyEnum> cb=new ComboBox<>();
cb.setItems(MyEnum.values());
cb.addValueChangeListener(event->{
refreshLabels(event.getValue());
});
add(cb);
add(textField1);
add(textField2);
//End of a method here
private void refreshLabels(MyEnum e){
switch(e){
case FIRST: textField1.setLabel("some Text");
textField2.setLabel("some Text");
break;
case SECOND: textField1.setLabel("some other Text");
textField2.setLabel("some other Text");
break;
}
}