如何使用scala.swing listenTo订阅Action属性更改?

时间:2015-02-02 12:11:10

标签: swing scala events properties javabeans

我有一个scala.swing Action,其中包含自定义属性mydomain.color。每当属性发生变化时,我想重新绘制一个绑定到此Action的按钮。应该可以订阅PropertyChangeEvent,但Action不是Publisher,因此不能用于listenTo

可以用普通的Java方式和write a Property Change Listener来实现,但是可能有一些更短的方法吗? Java bean可以用作scala.swing listenTo的发布者吗?

1 个答案:

答案 0 :(得分:0)

可以使用属性更改侦听器将Java bean事件转换为swing bean事件并将其发布,这并不困难:

import scala.swing._
import scala.swing.event._
import java.beans.{PropertyChangeListener, PropertyChangeEvent}

case class PropertyChanged(source: AnyRef, propertyName: String, oldValue: AnyRef, newValue: AnyRef) extends Event

trait ActionPropertyPublisher extends Action with Publisher {
  actionPublisher =>

  class ListenToPropertyChange extends PropertyChangeListener {
    override def propertyChange(evt: PropertyChangeEvent): Unit = {
      assert(SwingUtilities.isEventDispatchThread)
      assert(evt.getSource==actionPublisher.peer)
      publish(new PropertyChanged(actionPublisher,evt.getPropertyName,evt.getOldValue,evt.getNewValue))
    }
  }

  peer.addPropertyChangeListener(new ListenToPropertyChange())
}