Как добавить обработчики событий в составные панели в GWT 1.6

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

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 ответа

Решение

В этом случае расширение 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, но с дополнительными обработчиками событий, стилем и т. Д.

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

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

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

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

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

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

Другие вопросы по тегам