如何为javax.swing.Timer编写Scala包装器

Lui*_*hys 2 java swing scala timer wrapper

我想在Scala Swing应用程序中使用计时器.我可以使用Java版本,只是这意味着我必须实现ActionListener接口.我宁愿使用Scala Publishers/Reactors模型来保持一致性,所以我可以使用listenTo计时器.

这是我试过的:

class ScalaTimer(time: Int) extends Component {
  val t = new javax.swing.Timer(time, new java.awt.event.ActionListener {
    def actionPerformed(e: java.awt.event.ActionEvent) {
      publish(new scala.swing.event.ActionEvent(this))
    }
  })
  def start() {t.start()}
  def stop() {t.stop()}
  // etc

}
Run Code Online (Sandbox Code Playgroud)

不起作用this是因为引用了ActionListener而不是ScalaTimer类.

此外,我可能不应该扩展Component...我试过这个,因为我得到了Publisher/Reactor功能,但它没有真正意义.我应该这样做吗?如果是这样,我是否还需要包含其他特征,如何知道我必须实施哪些方法?

 class ScalaTimer extends javax.swing.Timer with Publisher {
Run Code Online (Sandbox Code Playgroud)

(我的IDE立即标记"缺少方法Timer(Int,ActionListener)的参数",这似乎有点奇怪,因为我没有调用方法.)

Rex*_*err 5

执行此操作的规范方法是在要引用的事物的顶部引入别名(通常self除非已经采用):

class ScalaTimer(time: Int) extends Component {
  self =>
  val t = ...
    publish(new scala.swing.event.ActionEvent(self))
  ...
Run Code Online (Sandbox Code Playgroud)