Ковыряюсь в Google Web Toolkit (GWT)...
Нужно сделать дерево элементами которого, в том числе, будут наборы RadioButton'ов и CheckBox'ов. При этом мне нужно постоянно отслеживать какие из этих элементов выбраны.
Я сотворил некий BitSet и установил для всех элементов ValueChangeHandler'ы, ожидая получать туда все события об изменении значения: и о выборе, и о снятии выбора. Для CheckBox'ов всё прекрасно работает.
А вот для RadioButton'ов так просто не получается. Как выяснилось, прилетает лишь событие выбора конкретного элемента. А вот события о снятия выбора с элемента ранее выбранного в той же группе не прилетает. При этом, BrowserEvent случается в обоих элементах.
Выглядит как баг GWT. Надо им письмо написать...
Для локального решения проблемы был модифицирован ValueChangeHandler, используемый для RadioButton'ов. Теперь он умеет хранить список всех элементов группы и, при приходе сообщения об изменении одного элемента группы, изменяят все остальные элементы.
// Создание группы RadioButton'ов String radioGroup = "Group"+group.hashCode(); Feature []features = group.getFeatures(); FTValueChangeHandler handler = new FTValueChangeHandler(features.length); for (Feature feature: features) { FTRadioButton rb = new FTRadioButton(radioGroup, feature.getName(), feature.getId(), handler); // Добавление RadioButton'ов в список у хендлера handler.addRadioButton(rb); item.addItem(rb); } // Хендлер private class FTValueChangeHandler implements ValueChangeHandler { private final FTRadioButton []rbuttons; private int rbi = 0; public FTValueChangeHandler() { rbuttons = null; } public FTValueChangeHandler(int size) { rbuttons = new FTRadioButton [size]; } public void addRadioButton(FTRadioButton rb) { rbuttons[rbi++] = rb; } public void onValueChange(ValueChangeEvent event) { Object obj = event.getSource(); int index = 0; boolean value = event.getValue().booleanValue(); if (obj instanceof FTRadioButton) { index = ((FTRadioButton)obj).getId(); // Unset bits for all other radio buttons in the same group if (value && rbuttons != null) { for (FTRadioButton rb: rbuttons) if (rb != obj) selectedFeatures.unset(rb.getId()); } } selectedFeatures.set(index, value); } }
Не очень красиво? Предложите лучше! 🙂