我有一个scala.swing Action,其中包含自定义属性mydomain.color
。每当属性发生变化时,我想重新绘制一个绑定到此Action的按钮。应该可以订阅PropertyChangeEvent,但Action
不是Publisher,因此不能用于listenTo
。
可以用普通的Java方式和write a Property Change Listener来实现,但是可能有一些更短的方法吗? Java bean可以用作scala.swing listenTo
的发布者吗?
答案 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())
}