Как мне получить от объекта «Событие» объект, на котором произошло это событие? - PullRequest
5 голосов
/ 22 марта 2012

Я разрабатываю приложение на GWT с UIBinder, и у меня есть проблема.В моем пользовательском интерфейсе может быть много одинаковых элементов (например, виджеты).Все элементы должны иметь обработчики, которые будут перехватывать событие щелчка мыши.Я хочу написать универсальный обработчик, который сможет идентифицировать виджет, вызвавший событие, и обработать его.Теперь у меня есть виджет для каждого объекта, чтобы описать один и тот же обработчик.Как я могу решить эту проблему?

Ответы [ 2 ]

7 голосов
/ 22 марта 2012

Вы должны привести исходный объект к ожидаемому объекту. Метод getSource () доставляет вам только объект, но вы не можете получить к нему какую-либо информацию (например, с помощью кнопки, сначала вы должны привести ее к кнопке).

Вот пример:

    Button bt = new Button("click");
    bt.addClickHandler(new ClickHandler() {

        @Override
        public void onClick(ClickEvent event) {
            Object soruce = event.getSource();

            if (soruce instanceof Button) {  //check that the source is really a button
                String buttonText = ((Button) soruce).getText();  //cast the source to a button
                RootPanel.get().add(new Label(buttonText));
            } else {
                RootPanel.get().add(new Label("Not a Button, can't be..."));
            }
        }
    });

    RootPanel.get().add(bt);

Это, конечно, также работает для кнопок UiBinder:

@UiHandler("button")
void onClick(ClickEvent e) {

    Object soruce = e.getSource();

    if(soruce instanceof Button){
        String buttonText = ((Button)soruce).getText();
        RootPanel.get().add(new Label(buttonText));
    }
    else {
        RootPanel.get().add(new Label("The event is not bound to a button"));
    }
}

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

1 голос
/ 22 марта 2012

Если вы хотите, чтобы один метод обрабатывал события нажатия для группы виджетов , то это так же просто, как:

@UiHandler({ "firstWidget", "secondWidget", "thirdWidget", "fourthWidget", andSoOn" })
void universalClickHandler(ClickEvent event) {
   // here, you can use event.getSource() to get a reference to the actual widget
   // that the event targeted.
}

Если вы хотите использовать делегирование событий через группу элементов , то вам нужно прослушать события щелчка на предке, а затем вы можете использовать event.getNativeEvent().getEventTarget(), чтобы получить фактический элемент, который был целью клика. Затем вы можете использовать isOrHasChild для Element, чтобы узнать, была ли фактическая цель клика в этом элементе (например, firstElement.isOrHasChild(Element.as(event.getNativeEvent().getEventtarget())), где firstElement является @UiField Element - или любой подкласс или Element, например как DivElement)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...