Запуск события обработчика из другого виджета в GWT

#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);