Как очистить поле после того, как я установил значение ComboBox как ноль? - PullRequest
0 голосов
/ 29 мая 2019

У меня есть ComboBox с именем projectRequirementComboBox, который зависит от 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();
            });

Ответы [ 2 ]

1 голос
/ 29 мая 2019

Существует открытая проблема в vaddin https://github.com/vaadin/framework/issues/9566, которая относится к https://github.com/vaadin/framework/issues/2813

Проходя через обнаруженную мной проблему,

Создав пользовательский выпадающий список, вы можете решить проблему,

public class ClearableComboBox<T> extends ComboBox<T> {
    public ClearableComboBox(String in) {
        super(in);
    }

    protected void setSelectedFromServer(T item) {
        String key = itemToKey(item);

        T oldSelection = getSelectedItem().orElse(getEmptyValue());
        doSetSelectedKey(key);

        fireEvent(new SingleSelectionEvent<>(ClearableComboBox.this, oldSelection, false));
    }       
}

Кроме того, обязательно позвоните setValue, прежде чем звонить setItems, чтобы очистить элементы.

cmb.setValue(null);
cmb.setItems(aEmptyCollection);
1 голос
/ 29 мая 2019

Обычно это должно работать.Я создал минимальный пример с двумя ComboBox «основной» и «зависимый».Выбор зависимого ComboBox зависит от выбора основного ComboBox.Поэтому в главном ComboBox есть ValueChangeListener, который сбрасывает элементы и выбранное значение зависимого ComboBox.Когда вы запускаете приложение, вы видите, что предлагаемые элементы зависимого 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);
}

ОБНОВЛЕНИЕ :

Естьпосмотрите на ответ Шринивасана Секара и его комментарии.Это ошибка в используемой версии (8.0.7), которая, по-видимому, исправлена ​​в версии 8.5 (в соответствии с https://github.com/vaadin/framework/issues/9047#issuecomment-437864866). Я попробовал свой пример кода с версией 8.7.1, чтобы он работал. С версией 8.0.7 этоне.

Таким образом, основное решение заключается в обновлении используемой версии Vaadin. В качестве обходного пути (если не удается обновить версию Vaadin), вам в первую очередь необходимо установить значение ComboBox на ноль, а затем установить новые элементы.Таким образом, в моем примере ValueChangeListener должен выглядеть так:

main.addValueChangeListener((HasValue.ValueChangeListener<String>) valueChangeEvent -> {
    if (valueChangeEvent.getValue() != null) {
        dependent.setValue(null);
        dependent.setItems(dependentsByMain.get(valueChangeEvent.getValue())); 
    }
});
...