2012-02-13 32 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亚型。