1

使用独立的 SWT 滚动条是一种 hack(使用这个解决方法),但它可以做到。这是一个片段:

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 样式的滚动工具提示

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

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);
    }
});

但是,当用户与滚动条交互时,两者似乎都scrollbar没有scrolledComposite响应该事件。SWT.MouseUp

我目前有一个解决方法,可以在超时后隐藏提示,但我对此并不满意。任何见解将不胜感激!

4

3 回答 3

3

滚动条的 javadoc 是这样说的:

调用 widgetSelected 时,事件对象详细信息字段包含以下值之一: SWT.NONE - 用于拖动结束。SWT.拖动。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);
}
于 2009-11-25T21:29:10.477 回答
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");
        }
    }
});

希望这会对您有所帮助...但是我可以看到使用鼠标滚轮的问题会引发多个拖动结束事件...

于 2009-12-16T09:34:28.243 回答
-1

保罗,

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

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

实际上,我不知道这种方法是否有效。但是,这是一种尝试。祝你好运!

于 2009-11-20T15:04:12.487 回答