【问题标题】:Mouse events on an SWT ScrollbarSWT 滚动条上的鼠标事件
【发布时间】:2010-12-18 18:04:02
【问题描述】:

使用独立的 SWT 滚动条有点像 hack(使用 this workaround),但它可以做到。这是一个sn-p:

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 样式的工具提示,显示滚动条的位置对应于哪个页面。

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

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 事件。

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

【问题讨论】:

    标签: java swt scrollbar mouseevent


    【解决方案1】:

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

    【讨论】:

    • 像魅力一样工作!非常感谢!
    【解决方案2】:
    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");
            }
        }
    });
    

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

    【讨论】:

      【解决方案3】:

      保罗,

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

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

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

      【讨论】:

      • 好建议,谢谢。然而,这只是简单地解析回 ScrolledComposite,它只响应组合本身中的事件,而不是滚动条中的事件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-30
      相关资源
      最近更新 更多