处理scala中的swing ScrollBar事件

时间:2012-02-13 21:03:38

标签: swing scala

我正在尝试添加ScrollBarScrollBar将遍历显示的文档。但是,当滚动条发生变化时,我无法收到事件。我不确定我需要听什么,而且我不确定我应该回应什么事。我尝试了下面的内容并得到了一些事件,但我认为这些事件并不理想。

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

例如,当我在滚动条内单击时,我只会获得MouseClickedMousePressedMouseReleased - 而不是在我点击箭头实际更改值时。

我发现this discussion关于滚动条没有正确接收事件,但它已经两年了。据我所知,作者没有跟踪文件的票据。也许他找到了解决方法。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

好问题。点击箭头不是由ScrollBar处理,而是由ScrollBarUI处理。我相信默认实现(或者至少是大多数ScrollBarUI实现的基类)是BasicScrollBarUI

如果您要查看javax.swing.plaf.basic.BasicScrollBarUI来源incrButtondecrButton按钮,那么它们就是您想听的组件。

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的子类型。