如果更改项目文本,则 RadioButtonGroups 不可单击

RadioButtonGroups are not clickable if Item Text is changed

我对 Vaadin 和 Java 还很陌生,所以显而易见的提示也可能是有益的。

在我看来,我有 5 个 RadioGroupButtons(Vaadin 的标准)。 主要的 RGB 更改其他四个 RGB 的项目文本。 一个现实生活中的例子是 select 一个汽车品牌(大众、宝马、起亚),每个品牌都有不同的型号。

我尝试在 MainView、RBG 和 RBG_Aggregat 中安装 ClickListener。还尝试将不同的 RBG 作为变量传递给不同的 classes。没有任何效果。 关于这些 RadioButtonGroups 的文档不多。 现在我找到了一些“活页夹”的例子,但我无法让它工作。

谁能指引我正确的方向?

谢谢!!

主视图的代码如下:我在问题所在的地方添加了注释。

@Route("test")
@PageTitle("test")

public class TestView extends VerticalLayout {
    HorizontalLayout hl =new HorizontalLayout();
    Gefährdungsbeurteilung gefährdungsbeurteilung=new Gefährdungsbeurteilung(1,"","","","","");
    RBG MG = new RBG("Mengengruppe");
    RBG WD = new RBG("Wirkungsdauer");
    RBG WF = new RBG("Wirkfläche");
    RBG FG = new RBG("Freisetzungsgruppe");
    RBG_Aggregat RBGAggregat= new RBG_Aggregat();//Main steering RBG

    public TestView(){
        hl.add(RBGAggregat.returnButton(),MG.returnButton(),WD.returnButton(),WF.returnButton(),FG.returnButton());
        add(hl);
    }

    public class RBG_Aggregat {
        public String selectedItem;
        public RadioButtonGroup radioGroup;

        public RBG_Aggregat() {
            this.radioGroup=new RadioButtonGroup();
            this.selectedItem="";
        }

        public RadioButtonGroup returnButton(){
            radioGroup.setItems("flüssig", "fest", "Gas/Aerosol");
            radioGroup.setLabel("Aggregat");
            radioGroup.addThemeVariants(RadioGroupVariant.LUMO_VERTICAL);
            addClickListener(event -> {
           if (radioGroup.getValue() == "flüssig") {
               gefährdungsbeurteilung.setAggregat("flüssig");
           }
           if (radioGroup.getValue() == "fest") {
               gefährdungsbeurteilung.setAggregat("fest");
           }
           if (radioGroup.getValue() == "Gas/Aerosol") {
               gefährdungsbeurteilung.setAggregat("Gas/Aerosol");
           }
  //if i comment the next for lines out, the RGB are clickable but the text is not changing.
                MG.updateHeader();
                WD.updateHeader();
                WF.updateHeader();
                FG.updateHeader();
 //if i do not comment out the privious 4 lines, the text is changing but the RBG are not clickable
            });
            return radioGroup;
        }
    }


    public class RBG{
        public ArrayList rbgitems;
        public String rbglabel;
        public RadioButtonGroup radioGroup;
        public String selectedItem;
        public String title;

        public RBG(String title) {
            this.radioGroup=new RadioButtonGroup();
            this.title= title;
            this.rbglabel=title;
            this.rbgitems= (ArrayList) gefährdungsbeurteilung.getDescription(title);
        }

        public void updateHeader(){
            radioGroup.setItems((ArrayList) gefährdungsbeurteilung.getDescription(getTitle()));
        }

        public RadioButtonGroup returnButton(){
            radioGroup.setItems(getRbgitems());
            radioGroup.setLabel(getRbglabel());
            radioGroup.addThemeVariants(RadioGroupVariant.LUMO_VERTICAL);
            return radioGroup;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }
        public ArrayList getRbgitems() {
            return rbgitems;
        }

        public void setRbgitems(ArrayList rbgitems) {
            this.rbgitems = rbgitems;
            radioGroup.setItems(rbgitems);
        }

        public String getRbglabel() {
            return rbglabel;
        }

        public void setRbglabel(String rbglabel) {
            this.rbglabel = rbglabel;
        }

        public String getSelectedItem() {
            return selectedItem;
        }

        public void setSelectedItem(String selectedItem) {
            this.selectedItem = selectedItem;
        }


        @Override
        public String toString() {
            return "RBG{" +
                    "rbgitems=" + rbgitems.toString() +
                    ", rbglabel='" + rbglabel + '\'' +
                    ", radioGroup=" + radioGroup +
                    ", selectedItem='" + selectedItem + '\'' +
                    ", title='" + title + '\'' +
                    '}';
        }
    }

}

不同项目的文本来自以下 class。

public class Gefährdungsbeurteilung {

    private int id;
    private String WF;
    private String WD;
    private String FG;
    private String MG;
    private String Aggregat;
    private Boolean visible;
    

    public Gefährdungsbeurteilung(int id, String WF, String WD, String FG, String MG, String aggregat) {
        this.id = id;
        this.WF = WF;
        this.WD = WD;
        this.FG = FG;
        this.MG = MG;
        this.Aggregat = aggregat;
    }

    public List getDescription(String titel) {
        String aggregat= getAggregat();
        ArrayList description= new ArrayList();
        if (titel=="Freisetzungsgruppe") {
            description.add("niedrig");
            description.add("mittel");
            description.add("hoch");
            if (aggregat == "flüssig" || aggregat == "Gas/Aerosol") {
                description.clear();
                description.add("niedrig (Siedepunkt größer 150°C)");
                description.add("mittel (Siedepunkt zwischen 50 und 150 °C)");
                description.add("hoch (Siedepunkt kleiner als 50°C)");
            }
            if (aggregat == "fest") {
                description.clear();
                description.add("niedrig (Granulat, Pellets, Wachs)");
                description.add("mittel (körnig: Staub, der sich absetzt (z. B. Waschmittel, Zucker))");
                description.add("hoch (feinpulvrig: Staub, der in der Luft bleibt (z. B. Mehl, Toner))");
            }
        }
        if (titel=="Wirkungsdauer"){
            description.add("kurz (kürzer als 15 min pro Tag)");
            description.add("lang (länger als 15 min pro Tag)");
        }
        if (titel=="Wirkungsfläche"){
            description.add("klein (z.B. Spritzer)");
            description.add("groß (z. B. Kontakt mit Händen oder Unterarmen)");
        }
        if (titel=="Mengengruppe"){
            description.add("klein");
            description.add("mittel");
            description.add("groß");
            if (aggregat == "flüssig" || aggregat == "Gas/Aerosol") {
                description.clear();
                description.add("klein (Arbeitsmenge unter einem Liter");
                description.add("mittel (Arbeitsmenge unter 1000l)");
                description.add("groß (Arbeitsmenge über 1000l)");
            }
            if (aggregat == "fest") {
                description.clear();
                description.add("klein (Arbeitsmenge unter einem Kilogramm");
                description.add("mittel (Arbeitsmenge unter einer Tonne)");
                description.add("groß (Arbeitsmenge über einer Tonne)");
            }
        }
        return description;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getWF() {
        return WF;
    }

    public void setWF(String WF) {
        this.WF = WF;
    }

    public String getWD() {
        return WD;
    }

    public void setWD(String WD) {
        this.WD = WD;
    }

    public String getFG() {
        return FG;
    }

    public void setFG(String FG) {
        this.FG = FG;
    }

    public String getMG() {
        return MG;
    }

    public void setMG(String MG) {
        this.MG = MG;
    }

    public String getAggregat() {
        return Aggregat;
    }

    public void setAggregat(String aggregat) {
        Aggregat = aggregat;
    }


    public Boolean getVisible(String titel) {
        String aggregat= getAggregat();
        visible=Boolean.TRUE;
        if (titel=="Wirkungsdauer"|| titel=="Wirkungsfläche"){if (aggregat=="Gas/Aerosol"){visible=Boolean.FALSE;}}
        return visible;
    }

}

这里的主要问题是 clickListener。 它已添加到 VerticalLayout 上:addClickListener(event -> { 因此,每次您单击整个布局时,您都在更改单选按钮组的项目。

你可以这样做:

radioGroup.addValueChangeListener(event -> {

它会起作用。

我注意到有几项不起作用(或可能不起作用):

  • titel=="Freisetzungsgruppe" 始终对 Java 中的字符串使用等于或对象等于 Objects.equals(titel, "Freisetzungsgruppe")
  • 您可以使用 List 而不是通用 List。
  • 您还应该避免在 Java class Gefahrdungsbeurteilung 中使用非 ascii 字符,而不是 Gefährdungsbeurteilung。

在您的例子中,代码看起来非常复杂,因为您在同一个地方操作所有标签。您可以拆分代码,只更改单选按钮组的显示标签。例如,有 1 个单选按钮:

public class TestView extends VerticalLayout {
    HorizontalLayout hl =new HorizontalLayout();
    RadioButtonGroup<String> agregat = new RadioButtonGroup<>();
    RadioButtonGroup<String> mengengruppe = new RadioButtonGroup<>();

    public TestView(){
        agregat.setItems("flüssig", "fest", "Gas/Aerosol");
        agregat.setLabel("Aggregat");
        agregat.addThemeVariants(RadioGroupVariant.LUMO_VERTICAL);
        agregat.addValueChangeListener(e -> {
            if (e.getValue() != null) {
                updateMengenGruppeRenderer(e.getValue());

            }
        });
        hl.add(agregat);

        mengengruppe.setVisible(false);
        mengengruppe.setItems("klein", "mittel", "groß");
        mengengruppe.setLabel("Mengengruppe");
        mengengruppe.addThemeVariants(RadioGroupVariant.LUMO_VERTICAL);

        hl.add(mengengruppe);
        add(hl);
    }

    private void updateMengenGruppeRenderer(String value) {
        mengengruppe.setVisible(true);
        mengengruppe.setRenderer(new TextRenderer<>(item -> {
            String description;
            if (value.equals("flüssig") || value.equals("Gas/Aerosol")) {
                if (Objects.equals(item, "niedrig")) {
                    description = " (Siedepunkt größer 150°C)";
                } else if (Objects.equals(item, "mittel")) {
                    description = " (Siedepunkt zwischen 50 und 150 °C)";
                } else {
                    description = " (Siedepunkt kleiner als 50°C)";
                }
            } else {

                if (Objects.equals(item, "niedrig")) {
                    description = " (Granulat, Pellets, Wachs)";
                } else if (Objects.equals(item, "mittel")) {
                    description = " (körnig: Staub, der sich absetzt (z. B. Waschmittel, Zucker))";
                } else {
                    description = " (feinpulvrig: Staub, der in der Luft bleibt (z. B. Mehl, Toner))";
                }
            }
            return item + description;
        }));
    }

}

我不能 100% 确定我是否理解你的问题,但如果你想根据另一个 RadioButtonGroup 中的选择更改一个 RadioButtonGroup 中显示的值,这是实现此目的的最佳方式是通过使用 ValueChangeListener:

public class HelloWorldView extends VerticalLayout {

  public HelloWorldView() {
    var data = new HashMap<String, List<String>>();
    data.put("Fruits", List.of("Banana", "Apple", "Orange"));
    data.put("Vegetables", List.of("Carrot", "Onion", "Potato"));
    data.put("Drinks", List.of("Water", "Beer", "Wine"));

    var categoriesSelect = new RadioButtonGroup<String>();
    var itemSelect = new RadioButtonGroup<String>();

    categoriesSelect.setItems(data.keySet());
    categoriesSelect.addValueChangeListener(e -> {
      var selectedCategory = e.getValue();
      itemSelect.setItems(data.get(selectedCategory));
    });

    add(categoriesSelect, itemSelect);
  }
}