2009-11-20 261 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"); 
     } 
    } 
}); 

希望這會幫助你,但我可以看到鼠標滾輪使用拋出多個拖動結束事件的問題...