JavaFX:使用带有 ChangeListener 的 StringProperty 基于 TimerTask 定期更新标签
JavaFX: Update Label regularly based on TimerTask using StringProperty with ChangeListener
我正在尝试使用 TimerTask 每秒更新一次标签,它会更改 StringProperty 的值:
public class RandomString extends TimerTask {
private StringProperty randomString;
private ArrayList<String> strings;
private Random random;
public RandomString(String... str) {
randomString = new SimpleStringProperty(this, "randomString", "");
strings = new ArrayList<>(Arrays.asList(str));
random = new Random();
}
public String getRandomString() {
return randomString.get();
}
public StringProperty randomStringProperty() {
return randomString;
}
public void setRandomString(String randomString) {
this.randomString.set(randomString);
}
@Override
public void run() {
int i = random.nextInt(strings.size());
setRandomString(strings.get(i));
}
public void startTimer() {
new Timer(true).schedule(this, 0, 1000);
}
为了更新标签,我向 StringProperty 添加了一个 ChangeListener,它根据字符串更改标签的文本:
randomString.randomStringProperty().addListener(
(observable, oldValue, newValue) ->
Platform.runLater(() -> label.setText(newValue)
));
但由于我必须 运行 使用 运行Later 方法进行此操作,因此标签不会定期更新。如何实现每秒更新一次?
对于那些对解决方案感兴趣的人:使用时间线而不是 TimerTask 工作得很好:
public void startTimer() {
Timeline timeline = new Timeline();
timeline.getKeyFrames().add(new KeyFrame(Duration.ZERO, event -> {
int i = random.nextInt(strings.size());
setRandomString(strings.get(i));
}));
timeline.getKeyFrames().add(new KeyFrame(Duration.seconds(1)));
timeline.setCycleCount(Timeline.INDEFINITE);
timeline.play();
}
感谢@JKostikiadis 分享这个post:
你也可以试试这个。您需要一个可运行的程序才能使其工作:
Timer t1 = new Timer();
private void startTimer() {
t1.schedule(new TimerTask() {
@Override
public void run() {
Platform.runLater(new Runnable() {
@Override
public void run() {
label.setText("Testing");
}
});
}
}, 0, 1000);
}
我正在尝试使用 TimerTask 每秒更新一次标签,它会更改 StringProperty 的值:
public class RandomString extends TimerTask {
private StringProperty randomString;
private ArrayList<String> strings;
private Random random;
public RandomString(String... str) {
randomString = new SimpleStringProperty(this, "randomString", "");
strings = new ArrayList<>(Arrays.asList(str));
random = new Random();
}
public String getRandomString() {
return randomString.get();
}
public StringProperty randomStringProperty() {
return randomString;
}
public void setRandomString(String randomString) {
this.randomString.set(randomString);
}
@Override
public void run() {
int i = random.nextInt(strings.size());
setRandomString(strings.get(i));
}
public void startTimer() {
new Timer(true).schedule(this, 0, 1000);
}
为了更新标签,我向 StringProperty 添加了一个 ChangeListener,它根据字符串更改标签的文本:
randomString.randomStringProperty().addListener(
(observable, oldValue, newValue) ->
Platform.runLater(() -> label.setText(newValue)
));
但由于我必须 运行 使用 运行Later 方法进行此操作,因此标签不会定期更新。如何实现每秒更新一次?
对于那些对解决方案感兴趣的人:使用时间线而不是 TimerTask 工作得很好:
public void startTimer() {
Timeline timeline = new Timeline();
timeline.getKeyFrames().add(new KeyFrame(Duration.ZERO, event -> {
int i = random.nextInt(strings.size());
setRandomString(strings.get(i));
}));
timeline.getKeyFrames().add(new KeyFrame(Duration.seconds(1)));
timeline.setCycleCount(Timeline.INDEFINITE);
timeline.play();
}
感谢@JKostikiadis 分享这个post:
你也可以试试这个。您需要一个可运行的程序才能使其工作:
Timer t1 = new Timer();
private void startTimer() {
t1.schedule(new TimerTask() {
@Override
public void run() {
Platform.runLater(new Runnable() {
@Override
public void run() {
label.setText("Testing");
}
});
}
}, 0, 1000);
}