Scala的手柄摆动ScrollBar事件
问题描述:
我正在尝试添加ScrollBar
。 ScrollBar
将迭代显示的文档。但是,当滚动条更改时,我无法接收事件。我不确定我需要听什么,但我不确定我应该回应什么事件。我尝试了以下方法并获得了一些活动,但我认为这些活动并不是理想的活动。Scala的手柄摆动ScrollBar事件
listenTo(scrollBar)
listenTo(scrollBar.keys)
listenTo(scrollBar.mouse.moves)
listenTo(scrollBar.mouse.wheel)
listenTo(scrollBar.mouse.clicks)
例如,我只得到MouseClicked
,MousePressed
和MouseReleased
当我点击滚动条里 - 不是当我点击箭头来真正改变值。
我发现this discussion滚动条没有正确接收事件,但它已经两岁了。据我所知,作者没有跟踪一个文件的票。也许他找到了解决方法。
任何想法?
答
好问题。点击箭头不由ScrollBar
处理,它由ScrollBarUI
处理。我相信默认实现(或者至少对于大部分实现的基类是BasicScrollBarUI
)。
如果你看看javax.swing.plaf.basic.BasicScrollBarUI
的来源,它有incrButton
和decrButton
按钮,它们是你想要听的组件。
P.S.我也有类似的需求,让我的Slider
拥有自定义(关键)侦听器,并拥有自定义的ui来公开所需的组件/模型(因为您可以看到几乎所有的组件都受到保护,因此您可以轻松地在子类中访问它们并通过公共获得者公开)为了我。尽管我用普通的java做了这些,但也许在scala中你可以通过specyfying属性名称来听按钮。
答
另外一块斯卡拉秋千被打破。 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
亚型。
你能上传整个代码吗?并且不能将滚动条添加到顶层容器窗口。 – unknown 2012-03-30 11:40:36
我将滚动条添加到容器。 – schmmd 2012-03-30 19:11:37