Я тоже облажался с этим и недавно выпустил эту маленькую вещь:
http://alpha2.colorboxthing.appspot.com/#/
Я в основном обернул все, что мне нужно, с помощью FocusPanel . В моем случае это была FlowPanel.
Из этой программы в моем UiBinder:
<g:FocusPanel ui:field="boxFocus" styleName="{style.boxFocus}">
<g:FlowPanel ui:field="boxPanel" styleName="{style.boxFocus}"></g:FlowPanel>
</g:FocusPanel>
Как я использую панель фокусировки (display.getBoxFocus (), показанный ниже, просто получает FocusPanel выше):
display.getBoxFocus().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
}
});
display.getBoxFocus().addMouseDownHandler(new MouseDownHandler() {
@Override
public void onMouseDown(MouseDownEvent event) {
}
});
display.getBoxFocus().addMouseMoveHandler(new MouseMoveHandler() {
@Override
public void onMouseMove(MouseMoveEvent event) {
}
});
display.getBoxFocus().addMouseUpHandler(new MouseUpHandler() {
@Override
public void onMouseUp(MouseUpEvent event) {
}
});
// etc!
Чтобы ответить на ваш вопрос о том, какой обработчик использовать для «перетаскивания», я не нашел ни одного обработчика, который бы сделал это для меня. Вместо этого я использовал MouseDownHandler
, MouseMoveHandler
и MouseUpHandler
.
Используйте MouseDownHandler
, чтобы установить флаг, который определяет, когда пользовательская мышь не работает. Я делаю это так, чтобы при вызове MouseMoveHandler
он знал, должен ли он что-либо делать или нет. Наконец, используйте MouseUpHandler
, чтобы переключить этот флаг, если пользователь нажимает кнопку мыши или нет.
В этом методе были некоторые недостатки (если пользователь перетаскивал свою мышь из FocusPanel), но, поскольку мое приложение было просто забавным побочным проектом, я не слишком задумывался о нем. Добавьте другие обработчики, чтобы исправить это, если это станет большой проблемой.