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