Как добавить обработчики событий в составные панели в GWT 1.6 - PullRequest
4 голосов
/ 06 мая 2009

Возможно, это действительно простая вещь, но я не знаю, как реализовать следующее.

package mods.client.resultSelector;

import com.google.gwt.event.dom.client.MouseDownEvent;
import com.google.gwt.event.dom.client.MouseDownHandler;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.Composite;

public class MousyAbsolutePanel extends Composite implements MouseDownHandler {

    AbsolutePanel abs = new AbsolutePanel();

    public MousyAbsolutePanel(int width){
        System.out.println("MousyAbsolutePanel being created with width:" + width);
        initWidget(abs);
        abs.setWidth(String.valueOf(width));
        abs.setHeight("100%");
        abs.setStyleName("mousyAbsolutePanel");
    }

    public void onMouseDown(MouseDownEvent event) {
        System.out.println("onMouseDown()");
    }

}

Я хочу иметь то, что фактически является absolutePanel, который может принимать события мыши. Однако в объекте Composite я не знаю, как связать написанный мной обработчик (onMouseDown ()) с переменной abs. Проще говоря, я хочу, чтобы abs AbsolutePanel реагировала на нажатие, но AbsolutePanels естественно не принимает события нажатия. Как мне это сделать?

Заранее извиняюсь, если это глупо просто, но я просто не совсем знаю, как реализовать это поведение, и я не видел, чтобы оно упоминалось в результатах моих поисков.

Ответы [ 4 ]

5 голосов
/ 21 мая 2009

В этом случае расширение Composite, вероятно, не лучшая идея, если вы не намеренно блокируете доступ к AbsolutePanel, которую вы создаете в конструкторе. Если вы расширите AbsolutePanel, вы сможете повторно использовать код для добавления / удаления виджетов и т. Д.

Вот как я бы порекомендовал вам это сделать:

package mods.client.resultSelector;

import com.google.gwt.event.dom.client.MouseDownEvent;
import com.google.gwt.event.dom.client.MouseDownHandler;
import com.google.gwt.event.dom.client.HasMouseDownHandlers;
import com.google.gwt.user.client.ui.AbsolutePanel;


public class MousyAbsolutePanel extends AbsolutePanel implements
                         MouseDownHandler,HasMouseDownHandlers {

    public MousyAbsolutePanel(int width) {
        System.out.println("MousyAbsolutePanel being created with width:" + width);

        this.setWidth(String.valueOf(width));
        this.setHeight("100%");
        this.setStyleName("mousyAbsolutePanel");

        this.addMouseDownHandler(this);
    }

    /** 
     * MouseDownHandler
     */
    public void onMouseDown(MouseDownEvent event) {
        System.out.println("onMouseDown()");
    }

    /**
     * HasMouseDownHandlers - Code to add handlers to the panel
     */  
    public HandlerRegistration addMouseDownHandler(MouseDownHandler handler) {
         return addDomHandler(handler, MouseDownEvent.getType());
    }

}

После этого вы можете получить доступ к MousyAbsolutePanel так же, как и к AbsolutePanel, но с дополнительными обработчиками событий, стилем и т. Д.

1 голос
/ 05 апреля 2011

Вот еще один пост, который может быть полезен:

Добавление ClickHandler в div, который содержит множество других виджетов

Вызов sinkEvents(Event.ONCLICK) и добавление ClickHandler с использованием только addHandler отлично работает для меня.

0 голосов
/ 02 июня 2009

После того, как вы позвоните initWidget(Widget), Composite будет правильно прокси-сервер регистрации события. Итак, вы можете просто позвонить MousyAbsolutePanel в наследство addDomHandler(...).

0 голосов
/ 07 мая 2009

Лучшее, что нужно сделать, чтобы узнать, как / что делать, - это посмотреть на пример. Например, класс FocusWidget (который реализует HasClickHandlers).

В частности, посмотрите на метод addClickHandler () и проследите его до конца.

...