JavaFX:使用 StringProperty 和 ChangeListener 根据 TimerTask 定期更新标签

标签 java javafx timertask

我尝试使用 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)
));

但是由于我必须使用 runLater 方法运行此操作,因此标签不会定期更新。如何实现每秒更新一次?

最佳答案

对于那些对解决方案感兴趣的人:使用时间线而不是 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 分享这篇文章:https://stackoverflow.com/a/16138351/4167500

关于JavaFX:使用 StringProperty 和 ChangeListener 根据 TimerTask 定期更新标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47491181/

相关文章:

java - Spring Boot - 不使用 WebSecurityConfigurerAdapter 的自定义身份验证过滤器

java - 运行 javafx 应用程序时没有出现窗口

java - 解决在 SWT FXCanvas 中嵌入 JavaFX 时的 DPI 缩放问题

java - 在不重新验证布局的情况下隐藏 swing 组件?

java - Gradle 卡在解决依赖关系 :testRunTime 处

macos - 构建 .dmg 包需要 Apple 开发者 ID

java - 如何在java中重置计时器?

java - 在View上持续控制旋转动画

java - UTF-8 语言的正则表达式