我有一个名为projectRequirementComboBox的ComboBox,它依赖于projectComboBox,从那里我可以看到要显示在projectRequirementComboBox下拉列表中的列表,但是我想做些类似的事情:当用户更改项目时,我想清空projectRequirementComboBox,以便更加清楚我现在正在这样做,但是我的projectRequirementComboBox仍然是旧值,我不知道缺少什么。我正在使用vaadin.version 8.0.7。
private void refreshProjectRequirementCombobox()
{
List<ProjectRequirement> projectRequirements = new ArrayList<>();
if (projectComboBox.getValue() != null)
{
projectRequirements = projectRequirementService.findCurrentProjectRequirements(projectComboBox.getValue().getProjectId());
}
projectRequirementComboBox.setItems(projectRequirements);
projectRequirementComboBox.setValue(null);
}
private void loadProjectRequirement(Project project)
{
List<ProjectRequirement> projectRequirements = new ArrayList<>();
if (project != null)
{
projectRequirements = projectRequirementService.findCurrentProjectRequirements(project.getProjectId());
}
projectRequirementComboBox.setItems(projectRequirements);
}
我在这里调用refreshProjectRequirementCombobox。
projectComboBox.addValueChangeListener(event ->
{
refreshProjectRequirementCombobox();
loadRejectReason();
});
最佳答案
通常,这应该可行。我用两个ComboBoxes“ main”和“ dependent”创建了一个最小示例。从属组合框的选择取决于主组合框的选择。因此,主组合框上有一个ValueChangeListener,用于重置项目和从属组合框的选定值。启动应用程序时,您会看到从属ComboBox的提供的项目发生了变化,并且这些新项目均未选中。
我认为您必须发布更多的代码(在哪里调用refreshProjectRequirementCombobox
?),以查看您的工作有所不同。
这是我的示例最小项目代码:
@Override
protected void init(VaadinRequest vaadinRequest) {
final VerticalLayout layout = new VerticalLayout();
final ComboBox<String> main = new ComboBox<>();
final ComboBox<String> dependent = new ComboBox<>();
final Map<String, String[]> dependentsByMain = new HashMap<>();
dependentsByMain.put("A", new String[]{"AA", "AB", "AC"});
dependentsByMain.put("B", new String[]{"BA", "BB", "BC"});
dependentsByMain.put("C", new String[]{"CA", "CB", "CC"});
List<String> mainItems = new ArrayList<>(dependentsByMain.keySet());
main.setItems(mainItems);
dependent.setItems(Arrays.asList("Test1", "Test2", "Test3"));
dependent.setValue("Test1");
main.addValueChangeListener((HasValue.ValueChangeListener<String>) valueChangeEvent -> {
if (valueChangeEvent.getValue() != null) {
dependent.setItems(dependentsByMain.get(valueChangeEvent.getValue()));
dependent.setValue(null);
}
});
layout.addComponents(main, dependent);
setContent(layout);
}
更新:
看看Srinivasan Sekar的答案及其评论。这是使用的版本(8.0.7)中的一个错误,该错误似乎已在8.5版中修复(根据https://github.com/vaadin/framework/issues/9047#issuecomment-437864866)。我尝试使用8.7.1版的示例代码,因此可以正常工作。在8.0.7版中则没有。
因此,主要解决方案是更新使用的Vaadin版本。解决方法(无法升级Vaadin版本时),首先必须将ComboBox的值设置为null,然后设置新项。因此,在我的示例中,ValueChangeListener必须类似于:
main.addValueChangeListener((HasValue.ValueChangeListener<String>) valueChangeEvent -> {
if (valueChangeEvent.getValue() != null) {
dependent.setValue(null);
dependent.setItems(dependentsByMain.get(valueChangeEvent.getValue()));
}
});