2009-11-20 266 views
1

使用独立SWT滚动条是一种破解(使用this workaround),但它可以完成。这里有一个片段:SWT滚动条上的鼠标事件

ScrolledComposite scrolledComposite = new ScrolledComposite(
       parent, SWT.V_SCROLL); 
ScrollBar scrollbar = scrolledComposite.getVerticalBar(); 
Shell tip = new Shell(UserInterface.getShell(), SWT.ON_TOP 
       | SWT.NO_FOCUS | SWT.TOOL); 
// ..stylize and fill the tooltip.. 

现在我想要做的是监视用户与滚动条交互时。特别是,我想知道用户何时拖动滚动条—以及何时发布了—以显示Office 2007样式的工具提示,以显示滚动条位置与哪个页面相对应。

Word-style scrolling tooltip

目前,我有以下的代码,其显示工具提示:

scrollbar.addSelectionListener(new SelectionListener() { 
    public void widgetDefaultSelected(SelectionEvent event) {} 
    public void widgetSelected(SelectionEvent event) { 
     tip.setVisible(true); 
    } 
} 

这似乎逻辑然后有工具提示消失时释放鼠标按钮:

scrollbar.addListener(SWT.MouseUp, new Listener() { 
    public void handleEvent(Event event) { 
     tip.setVisible(false); 
    } 
}); 

但是,scrollbarscrolledComposite似乎都不会对SWT.MouseUp ev当用户与滚动条交互时。

我目前有一个解决方法,在超时后隐藏提示,但我对此不满意。任何见解都将非常感谢!

回答

2

滚动条的Javadoc这样说:

当widgetSelected被调用时, 事件对象详细字段包含下列值之一 :SWT.NONE - 为拖动的结束。 SWT.DRAG。 SWT.HOME。 SWT.END。 SWT.ARROW_DOWN。 SWT.ARROW_UP。 SWT.PAGE_DOWN。 SWT.PAGE_UP。未调用widgetDefaultSelected为 。

所以我的建议是让你的工具提示出现和消失是检查event.detail类型。

public void widgetSelected(SelectionEvent event) { 
    tip.setVisible(event.detail != SWT.NONE); 
} 
+0

优秀!我会看看早晨是否足够第一件事。 – 2009-11-25 23:36:26

+0

工程就像一个魅力!非常感谢你! – 2009-11-26 09:21:40

-1

Paul,

尝试使用Scrollable对象的addMouseEvent方法。例如:

Scrollable scrollable = scrollbar.getParent(); 
scrollable.addMouseListener(new MouseListener() { 
    void mouseDoubleClick(MouseEvent e) { ... } 
    void mouseDown(MouseEvent e) { ... } 
    void mouseUp(MouseEvent e) { ... } 
}); 

其实,我不知道这种方法是否可行。但是,这是一个尝试。 祝你好运!

+0

很好的建议,谢谢。这只是解决了ScrolledComposite,但是,它只响应组合本身内的事件,而不是滚动条。 – 2009-11-20 15:08:28

3
scrollBar.addSelectionListener(new SelectionListener() { 
    public void widgetDefaultSelected(SelectionEvent e) { 
    } 

    public void widgetSelected(SelectionEvent e) { 
     if (e.detail == SWT.NONE) { 
      // end of drag 
      System.out.println("Drag end"); 
     } 
     else if (e.detail == SWT.DRAG) { 
      // drag 
      System.out.println("Currently dragging"); 
     } 
    } 
}); 

希望这会帮助你,但我可以看到鼠标滚轮使用抛出多个拖动结束事件的问题...