Вот обходной путь, который я нашел в данном конкретном случае: отправьте фиктивный ActionListener, затем удалите и замените реальным.
class ScalaTimer2 private (delay: Int, listener: java.awt.event.ActionListener)
extends javax.swing.Timer(delay, listener) with swing.Publisher {
outer =>
def this(delay: Int) =
this(delay, new java.awt.event.ActionListener {
def actionPerformed(e: java.awt.event.ActionEvent) { } // dummy
})
removeActionListener(listener)
addActionListener(new java.awt.event.ActionListener {
def actionPerformed(e: java.awt.event.ActionEvent) {
publish(new TimerEvent(outer))
}
})
}
Редактирование: еще один прием: создание основного конструктора private
, чтобынет возможности ошибочно попробовать конструировать с вашим собственным ActionListener
.
Edit 2: или вообще избежать вспомогательного конструктора, передав анонимный ActionListener в подпись.
Edit 3 - решено!: Я только что прочитал в Javadoc, что ActionListener, переданный конструктору, может быть нулевым!Таким образом, все, что нам действительно нужно, это:
class ScalaTimer2 (delay: Int) extends Timer(delay, null) with Publisher {
outer =>
addActionListener(new ActionListener {
def actionPerformed(e: ActionEvent) {
publish(new TimerEvent(outer))
}
})
}