Да, это возможно. В двух словах: звоните setTimeStr
вместо того, чтобы устанавливать свойство напрямую.
Обход установщика означал, что ни один из кодов, добавленных @Bindable
, не выполнялся, поэтому уведомления об изменении свойства не отправлялись.
Другие правки включают незначительную очистку, удаление шума, сокращение задержки до скоростной отладки и т. Д.
import groovy.swing.SwingBuilder
import java.awt.FlowLayout as FL
import javax.swing.BoxLayout as BXL
import javax.swing.JFrame
import groovy.beans.Bindable
import java.util.timer.*
class CountDown {
int delay = 1000
int period = 5 * 1000
int remainingTime = 25 * 60 *1000
@Bindable String timeStr = "25:00"
public void timeString() {
int seconds = ((int) (remainingTime / 1000)) % 60 ;
int minutes =((int) (remainingTime / (1000*60))) % 60;
// Here's the issue
// timeStr = ((minutes < 9) ? "0" : "") + minutes + ":" + ((seconds < 9) ? "0" : "") + seconds
setTimeStr(String.format("%02d:%02d", minutes, seconds))
}
public void update() {
if (remainingTime >= period) {
remainingTime -= period
}
timeString()
}
}
class TimerTaskCountDown extends TimerTask {
CountDown model
public TimerTaskCountDown (CountDown model) {
super()
this.model = model
}
public void run() {
model.update()
}
}
model = new CountDown()
ttcd = new TimerTaskCountDown(model)
timer = new Timer()
timer.scheduleAtFixedRate(ttcd, model.delay, model.period)
def s = new SwingBuilder()
s.setVariable('myDialog-properties',[:])
def dial = s.dialog(title:'Pomodoro', id:'working', modal:false, defaultCloseOperation:JFrame.DISPOSE_ON_CLOSE, pack:true, show:true) {
panel() {
boxLayout(axis:BXL.Y_AXIS)
panel(alignmentX:0f) {
flowLayout(alignment:FL.LEFT)
label text: bind { "Pomodoro time: " + model.timeStr }
}
panel(alignmentX:0f) {
flowLayout(alignment:FL.RIGHT)
button(action: action(name: 'STOP', defaultButton: true, mnemonic: 'S', closure: { model.timeStr = "stopped"; vars.ok = true }))
}
}
}