首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果项文本被更改,则RadioButtonGroups不可单击。

如果项文本被更改,则RadioButtonGroups不可单击。
EN

Stack Overflow用户
提问于 2021-05-03 21:05:47
回答 2查看 75关注 0票数 0

我对Vaadin和Java相当陌生,所以显而易见的技巧也可能是有益的。

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

我试着让ClickListener在MainView、RBG和RBG_Aggregat中使用。还试图将不同的RBG作为变量传递给不同的类。什么都没用。这些RadioButtonGroups上没有太多的文档。现在我已经找到了一些“活页夹”的例子,但我无法使它发挥作用。

有人能把我引向正确的方向吗?

谢谢!!

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

代码语言:javascript
复制
@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 + '\'' +
                    '}';
        }
    }

}

不同项的文本来源于以下类。

代码语言:javascript
复制
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;
    }

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-04 05:19:40

这里的主要问题是clickListener。它被添加到VerticalLayout:addClickListener(event -> {上,所以每次单击整个布局时,您都会更改无线电按钮组的项目。

你可以这样做:

radioGroup.addValueChangeListener(event -> {

看起来不错。

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

在Java中,

  • titel=="Freisetzungsgruppe"总是使用等于字符串,或者像Objects.equals(titel, "Freisetzungsgruppe")
  • You这样的对象可以使用List而不是泛型列表。

在您的示例中,代码看起来非常复杂,因为您在同一个位置操作所有标签。您可以拆分代码,只更改无线电按钮组的显示标签。例如,用一个无线电按钮:

代码语言:javascript
复制
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;
        }));
    }

}
票数 6
EN

Stack Overflow用户

发布于 2021-05-04 21:31:02

我不能100%肯定我是否正确地理解了您的问题,但是如果您希望根据另一个RadioButtonGroup中的选择更改一个ValueChangeListener中显示的值,那么最好的方法就是使用一个ValueChangeListener

代码语言:javascript
复制
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);
  }
}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67375809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档