如果更改项目文本,则 RadioButtonGroups 不可单击
RadioButtonGroups are not clickable if Item Text is changed
我对 Vaadin 和 Java 还很陌生,所以显而易见的提示也可能是有益的。
在我看来,我有 5 个 RadioGroupButtons(Vaadin 的标准)。
主要的 RGB 更改其他四个 RGB 的项目文本。
一个现实生活中的例子是 select 一个汽车品牌(大众、宝马、起亚),每个品牌都有不同的型号。
我尝试在 MainView、RBG 和 RBG_Aggregat 中安装 ClickListener。还尝试将不同的 RBG 作为变量传递给不同的 classes。没有任何效果。
关于这些 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 + '\'' +
'}';
}
}
}
不同项目的文本来自以下 class。
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 class 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;
}));
}
}
我不能 100% 确定我是否理解你的问题,但如果你想根据另一个 RadioButtonGroup
中的选择更改一个 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);
}
}
我对 Vaadin 和 Java 还很陌生,所以显而易见的提示也可能是有益的。
在我看来,我有 5 个 RadioGroupButtons(Vaadin 的标准)。 主要的 RGB 更改其他四个 RGB 的项目文本。 一个现实生活中的例子是 select 一个汽车品牌(大众、宝马、起亚),每个品牌都有不同的型号。
我尝试在 MainView、RBG 和 RBG_Aggregat 中安装 ClickListener。还尝试将不同的 RBG 作为变量传递给不同的 classes。没有任何效果。 关于这些 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 + '\'' +
'}';
}
}
}
不同项目的文本来自以下 class。
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 class 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;
}));
}
}
我不能 100% 确定我是否理解你的问题,但如果你想根据另一个 RadioButtonGroup
中的选择更改一个 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);
}
}