首页 > 解决方案 > 如果更改项目文本,则 RadioButtonGroups 不可点击

问题描述

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

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

我尝试在 MainView、RBG 和 RBG_Aggregat 中使用 ClickListener。还尝试将不同的 RBG 作为变量传递给不同的类。没有任何效果。关于这些 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 + '\'' +
                    '}';
        }
    }

}

不同项目的文本源自以下类。

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

}

标签: javaradio-buttonvaadinradio-group

解决方案


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

你可以这样做:

radioGroup.addValueChangeListener(event -> {

它会起作用的。

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

  • titel=="Freisetzungsgruppe"始终对 Java 中的 String 或 Objects 使用 equals 等Objects.equals(titel, "Freisetzungsgruppe")
  • 您可以使用 List 而不是通用 List。
  • 您还应该避免在 Java 类 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;
        }));
    }

}

推荐阅读