如何为光标设置自己的图像以进行拖动操作

时间:2015-07-08 07:55:38

标签: eclipse-rap

可以通过这种方式设置/更改光标图像以进行拖动操作:

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 个答案:

答案 0 :(得分:1)

作为缺失API的解决方法(请参阅Rüdiger的回答),您可以尝试在拖动时设置自定义变体:

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

并在CSS中为此变体配置自定义光标,如下所示:

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

答案 1 :(得分:1)

我现在已经在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代码可以做同样的事情。

顺便说一句:我想使用ClientScrpting API中的event.button,但是如果没有按下鼠标按钮(或者右键单击3),它总是返回1。

答案 2 :(得分:0)

SWT / Desktop的Cursor构造函数接受ImageData

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

但RWT不提供此API,因此无法显示自定义游标。

另请参阅此开放增强请求:Bug 295806 - Cursor constructor with ImageData is missing

修改

如果不厌倦自己,您可以使用CSS和custom variants来解决这个限制。

定义一个CSS规则,该规则将所有小部件与自定义变体customCursor匹配,并将光标更改为所需的小部件:

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

现在您可以将自定义变体分配给最外层的shell(假设有一个覆盖整个显示的最大化shell)。

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

如果CSS游标不是从父控件继承继承,则可能需要迭代窗口小部件层次结构并为应显示自定义游标的所有控件显式设置自定义变量。