Как реализовать слушатель событий мыши за пределами браузера?

Рейтинг: 1Ответов: 1Опубликовано: 27.01.2011

Воспользовался советом, который дали в этой теме. Делаю вторым способом, но это вряд ли влияет на ситуацию. Столбцы таблицы отлично изменяют размеры. Но есть одна проблема. Если увожу курсор за пределы окна браузера, то моё приложение не ловит события. Так может получиться, что пользователь уже отпустил кнопку, а когда возвращает курсор в пределы окна, то снова начинается перемещение. По логике, столбцы должны нормально ресайзиться независимо от того, внутри или снаружи окна браузера курсор. В google-docs это каким-то образом работает. На данный момент я делаю примерно так:

Ресайзер ловит событие mouse-down и запрещает выделение в браузере (применяет стиль), а также добавляет слушатели для RootPanel:

handlerRegistrations.add(RootPanel.get().addDomHandler(new MouseUpHandler() { 
    public void onMouseUp(MouseUpEvent e) { 
      resize(e);  
      setDragged(false);
    } 
  }, MouseUpEvent.getType());
); 
handlerRegistrations.add(RootPanel.get().addDomHandler(new MouseMoveHandler() { 
    public void onMouseMove(MouseMoveEvent e) { 
      resize(e);  
    } 
  }, MouseMoveEvent.getType());
); 
handlerRegistrations.add(RootPanel.get().addDomHandler(new MouseOutHandler() { 
    public void onMouseOut(MouseOutEvent e) { 
      setDragged(false);
    } 
  }, MouseOutEvent.getType());
); 

Для прекращения перетаскивания удаляю все эти слушатели (очищаю handlerRegistrations) и разрешаю снова выделение в браузере. Как видите, сейчас если мышь уводить за пределы окна, то мы прекращаем перетаскивание.

Как же всё-таки сделать, чтобы отлавливать события и за пределами браузера?

Ответы

▲ 2Принят

Попробуйте посмотреть на примеры Зауэра. Там есть ссылки на код. Автор использует Drag and Drop. Если посмотреть на другие примеры, то можно видеть, что DragAndDrop не обладает указанным вами недостатом, так как мышь захватывается и продолжает "перетаскивание" даже если мышь за пределами окна. А если отпустить, то DnD прерывается.