Как установить собственное изображение для курсора для операции перетаскивания

Можно установить / изменить изображение для курсора для операции перетаскивания следующим образом:

Listener listener = new Listener() {
  public void handleEvent(Event event) {
    switch (event.type) {
      case SWT.MouseDown:
        moveComposite.setCursor(Display.getCurrent().getSystemCursor(SWT.CURSOR_WAIT));
        ...
      }
  ...

moveComposite.addListener(SWT.MouseDown, listener);

Но в этом случае могут быть установлены только стандартные курсоры.

Можно ли установить собственное изображение для курсора для операции перетаскивания?
Либо в CSS для именованного элемента управления, программно для именованного элемента управления или в качестве альтернативы, глобально меняющего стандартные курсоры.

3 ответа

Я решил это сейчас с помощью ClientListener. Поскольку SWT.DragDetect не поддерживается, я должен использовать SWT.MouseMove

final private String scriptCodeMouseMove =
    "var handleEvent = function(event) {\n"
  + "    if(window.event.which==1) {"
  + "        document.body.style.cursor = 'url(...url to image...),, auto';\n"
  + "    } else {"
  + "        document.body.style.cursor = 'auto';\n"
  + "    }"
  + "}";

composite.addListener(SWT.MouseMove, new ClientListener(scriptCodeMouseMove));

Не очень хорошо, но это работает для меня.
Таким образом, курсор также изменяется, если кнопка мыши нажата без операции перетаскивания.

Я действительно не являюсь разработчиком JavaScript, поэтому я уверен, что есть намного лучший JavaScript-код, который может делать то же самое.

Кстати: я хотел использовать event.button из ClientScrpting API, но он всегда возвращал 1, даже если не была нажата ни одна кнопка мыши (или 3 выполняла щелчок правой кнопкой мыши).

В качестве обходного пути для отсутствующего API (см. Ответ Рюдигера), вы можете попытаться установить пользовательский вариант при перетаскивании:

moveComposite.setData(RWT.CUSTOM_VARIANT, "dragging");

и настройте пользовательский курсор для этого варианта в CSS следующим образом:

.dragging {
  cursor: url(resources/dragging.gif)
}

SWT/Desktop имеет Cursor конструкторы, которые принимают ImageData лайк

Cursor( Device device, ImageData source, ... )

но RWT не предоставляет этот API и, следовательно, не может отображать пользовательские курсоры.

См. Также этот открытый запрос на усовершенствование: Ошибка 295806 - отсутствует конструктор курсора с ImageData

РЕДАКТИРОВАТЬ:

Не уставая, вы можете обойти это ограничение с помощью CSS и пользовательских вариантов.

Определите правило CSS, которое соответствует всем виджетам с пользовательским вариантом customCursor и меняет курсор на нужный:

.customCursor {
  cursor: url( ... );
}

Теперь вы можете назначить пользовательский вариант самой внешней оболочке (при условии, что есть развернутая оболочка, которая покрывает весь экран).

Shell outermostShell = ...
outermostShell.setData( SWT.CUSTOM_VARIANT, "customCursor" );

Если курсор CSS не наследуется от родительских элементов управления к дочерним, вам может потребоваться выполнить итерацию по иерархии виджетов и явно задать пользовательский вариант для всех элементов управления, которые должны отображать пользовательский курсор.

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