我正在尝试添加ScrollBar
。 ScrollBar
将遍历显示的文档。但是,当滚动条发生变化时,我无法收到事件。我不确定我需要听什么,而且我不确定我应该回应什么事。我尝试了下面的内容并得到了一些事件,但我认为这些事件并不理想。
listenTo(scrollBar)
listenTo(scrollBar.keys)
listenTo(scrollBar.mouse.moves)
listenTo(scrollBar.mouse.wheel)
listenTo(scrollBar.mouse.clicks)
例如,当我在滚动条内单击时,我只会获得MouseClicked
,MousePressed
和MouseReleased
- 而不是在我点击箭头实际更改值时。
我发现this discussion关于滚动条没有正确接收事件,但它已经两年了。据我所知,作者没有跟踪文件的票据。也许他找到了解决方法。
有什么想法吗?
答案 0 :(得分:1)
好问题。点击箭头不是由ScrollBar
处理,而是由ScrollBarUI
处理。我相信默认实现(或者至少是大多数ScrollBarUI
实现的基类)是BasicScrollBarUI
。
如果您要查看javax.swing.plaf.basic.BasicScrollBarUI
来源incrButton
和decrButton
按钮,那么它们就是您想听的组件。
P.S。我有类似的需要为我的Slider
拥有自定义(关键)监听器并拥有自定义ui,它暴露了所需的组件/模型(因为你可以看到几乎所有组件都受到保护,因此你可以轻松地在子类中访问它们并通过公共公开getters)对我很有用。我在普通的java中做到了这一点,也许在scala你可以通过specyfying属性名称来听按钮。
答案 1 :(得分:0)
另一件Scala Swing被打破了。 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
的子类型。