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