#java #gwt
Вопрос:
У меня есть два списка, предположим customerListBox
, и timeListBox
, и ярлык resultLabel
. Когда timeListBox
значение s изменяется, он запускает свой ValueChangeHandler
(назовем его recalculateValueHandler
так), который пересчитывает результат и помещает его в resultLabel
. Мне нужно, чтобы это работало наоборот — при customerListBox
изменении значения мне нужно пересчитать новый результат для того же значения времени, но для другого клиента. Поэтому мне нужно что-то вроде customerListBox.onValueChange(fire(recalculateValueHandler))
: надеюсь , вы понимаете. Есть ли что-нибудь, что могло бы сработать для меня таким образом? Я стараюсь избегать дублирования практически одного и того же кода в обоих обработчиках.
Ответ №1:
Вам просто нужны три вещи
- объявите все элементы на верхнем уровне, чтобы они были доступны для всех методов
- создайте метод, который пересчитывает значение, назовем его
recalculateValue
- добавьте
ChangeHandler
s для обоихListBox
es (ListBox
нетValueChangeHandler
), которые будут вызыватьrecalculateValue
метод.
Рабочий пример:
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RootPanel;
public class Test implements EntryPoint {
// elements declared at top level are accessible across all methods
private ListBox customerListBox;
private ListBox timeListBox;
private Label resultLabel;
@Override
public void onModuleLoad() {
// add some data
customerListBox = new ListBox();
for(int i = 0; i < 10; i )
customerListBox.addItem("Customer " (i 1));
// add some data
timeListBox = new ListBox();
for(int i = 0; i < 10; i )
timeListBox.addItem("Time " (i 1));
resultLabel = new Label();
// recalculateValue when customerListBox changes
customerListBox.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
recalculateValue();
}
});
// recalculateValue when timeListBox changes
timeListBox.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
recalculateValue();
}
});
// initial result (optional)
recalculateValue();
// show elements
RootPanel.get().clear();
RootPanel.get().add(customerListBox);
RootPanel.get().add(timeListBox);
RootPanel.get().add(resultLabel);
}
private void recalculateValue() {
// use values from ListBoxes
resultLabel.setText(customerListBox.getSelectedValue() " / " timeListBox.getSelectedValue());
}
}
Обратите внимание, что оба обработчика идентичны, поэтому вы можете создать только один обработчик и использовать его для ListBox
обоих таких случаев:
ChangeHandler handler = new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
recalculateValue();
}
};
// recalculateValue when customerListBox changes
customerListBox.addChangeHandler(handler);
// recalculateValue when timeListBox changes
timeListBox.addChangeHandler(handler);