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

如何解决如果更改项目文本,则 RadioButtonGroups 不可点击

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

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

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

有人能指引我朝正确的方向发展吗?

谢谢!!

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

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

}

解决方法

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

你可以这样做:

radioGroup.addValueChangeListener(event -> {

它会起作用。

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

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

在您的情况下,代码看起来非常复杂,因为您在同一位置操作所有标签。您可以拆分代码,只更改单选按钮组的显示标签。例如有 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 中的选择更改其中显示的值,那么最好的方法是通过使用 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);
  }
}

Two radio button groups. The first one shows the categories: Vegetables,Drinks,Fruits with Fruits selected. The second group shows options Banana,Apple,Orange,with Apple selected.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res