如果更改项目文本,则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 -> {
所以每次你点击整个布局时,你都会改变 radiobuttongroup 的项目。
你可以这样做:
radioGroup.addValueChangeListener(event -> {
它会起作用。
我注意到有几件事不起作用(或可能不起作用):
titel=="Freisetzungsgruppe"在 Java 中始终对 String 使用 equals 或 Objects equals likeObjects.equals(titel, "Freisetzungsgruppe")- 您可以使用 List 而不是通用 List。
- 您还应该避免在 Java 类 Gefahrdungsbeurteilung 而不是 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;
}));
}
}