构建UI后,为什么不能修改vaadin组件状态?

时间:2019-07-02 19:07:29

标签: spring vaadin vaadin-flow

我有一个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上。有人可以向我解释一下吗?

1 个答案:

答案 0 :(得分:3)

实际上,您的第一种方法没有任何问题,组合框应正确地更新文本字段标签的值。问题出在您的switch块中的代码段中。您忘记在此处添加break;。因此,如果存在任何匹配项,则值始终设置为second(last)选项。 (在第二种情况下,您要通过从方法返回来终止switch的执行,因此该方法在那里起作用)

来自oracle tutorial

  

每个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;
             }
     }