java - 如果更改项目文本,则 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;
}
}
解决方案
这里的主要问题是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;
}));
}
}
推荐阅读
- css - 删除 FF 和 IE 上文本溢出省略号的多余空格结尾
- postgresql - 如何列出按id分组的表中的文档?
- r - 如何在闪亮的应用程序中创建上传图像的堆栈
- typescript - 打字稿:从应用于键控对象的字符串文字联合推断正确的类型
- powershell - 计算嵌套在其他安全组中的安全组
- android - 图像未在视图寻呼机中加载
- java - 嵌套循环时间复杂度 for( i = n; i > 0; i /= 2) VS for( i = n; i > 0; i/=2) for( j = 0; j < i; j++)
- c - ac 程序上的 8、16、32 和 64 位微控制器上的字长、int 大小和指针是多少?
- hibernate-envers - 如果通过添加新实体更改 @oneToMany - 实体,则修订包含其他字段的空值
- c# - uwp ListView 没有 SelectionChanging 事件