2012-02-13 31 views
4

我正在嘗試添加ScrollBarScrollBar將迭代顯示的文檔。但是,當滾動條更改時,我無法接收事件。我不確定我需要聽什麼,但我不確定我應該回應什麼事件。我嘗試了以下方法並獲得了一些活動,但我認爲這些活動並不是理想的活動。Scala的手柄擺動ScrollBar事件

listenTo(scrollBar) 
    listenTo(scrollBar.keys) 
    listenTo(scrollBar.mouse.moves) 
    listenTo(scrollBar.mouse.wheel) 
    listenTo(scrollBar.mouse.clicks) 

例如,我只得到MouseClickedMousePressedMouseReleased當我點擊滾動條裏 - 不是當我點擊箭頭來真正改變值。

我發現this discussion滾動條沒有正確接收事件,但它已經兩歲了。據我所知,作者沒有跟蹤一個文件的票。也許他找到了解決方法。

任何想法?

+0

你能上傳整個代碼嗎?並且不能將滾動條添加到頂層容器窗口。 – unknown 2012-03-30 11:40:36

+0

我將滾動條添加到容器。 – schmmd 2012-03-30 19:11:37

回答

1

好問題。點擊箭頭不由ScrollBar處理,它由ScrollBarUI處理。我相信默認實現(或者至少對於大部分實現的基類是BasicScrollBarUI)。

如果你看看javax.swing.plaf.basic.BasicScrollBarUI的來源,它有incrButtondecrButton按鈕,它們是你想要聽的組件。

P.S.我也有類似的需求,讓我的Slider擁有自定義(關鍵)偵聽器,並擁有自定義的ui來公開所需的組件/模型(因爲您可以看到幾乎所有的組件都受到保護,因此您可以輕鬆地在子類中訪問它們並通過公共獲得者公開)爲了我。儘管我用普通的java做了這些,但也許在scala中你可以通過specyfying屬性名稱來聽按鈕。

0

另外一塊斯卡拉鞦韆被打破。 Adjustable性狀似乎完全空洞,沒有任何連線。

以下工作:

class ScrollBarAlive extends swing.ScrollBar { 
    me => 
    peer.addAdjustmentListener(new java.awt.event.AdjustmentListener { 
    def adjustmentValueChanged(e: java.awt.event.AdjustmentEvent) { 
     publish(new swing.event.ValueChanged(me)) 
    } 
    }) 
} 

測試:

import swing._ 

object ScrollBarTest extends SimpleSwingApplication { 
    lazy val top = new Frame { 
    val label = new Label { text = "0" } 
    val scroll = new ScrollBarAlive { 
     orientation = Orientation.Horizontal 
     listenTo(this) 
     reactions += { 
     case event.ValueChanged(_) => 
      label.text = value.toString + (if (valueIsAjusting) " A" else "") 
     } 
    } 
    contents = new BorderPanel { 
     add(label, BorderPanel.Position.North) 
     add(scroll, BorderPanel.Position.South) 
    } 
    pack().centerOnScreen() 
    open() 
    } 
} 

一個適當的實施也將引入AdjustingEvent亞型。