Как добавить обработчики событий в составные панели в 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() и проследите его.