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

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

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 для именованного элемента управления, либо программно для именованного элемента управления, либо, в качестве альтернативы, глобально изменив стандартные курсоры.


person Michael    schedule 08.07.2015    source источник


Ответы (3)


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

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

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

.dragging {
  cursor: url(resources/dragging.gif)
}
person ralfstx    schedule 08.07.2015
comment
Это отлично работает для кнопки, метки... но не для композита. Кроме того, в документации RWT Theming Reference не упоминается свойство CSS, называемое курсором. - person Michael; 08.07.2015

Я решил это сейчас с помощью 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 из API ClientScrpting, но он всегда возвращал 1, даже если кнопка мыши не была нажата (или 3 при щелчке правой кнопкой мыши).

person Michael    schedule 09.07.2015

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 не наследуется от родительского к дочернему элементу управления, вам может потребоваться выполнить итерацию по иерархии виджетов и явно установить пользовательский вариант для всех элементов управления, которые должны отображать пользовательский курсор.

person Rüdiger Herrmann    schedule 08.07.2015
comment
Я знаю из-за этого отсутствующего конструктора, но не из-за этой ошибки, спасибо. Я надеялся, что есть какой-то «обходной путь». Например, установка курсора через CSS в элемент управления и получение его с помощью control.getCursor() или любой другой идеи. - person Michael; 08.07.2015