繁体   English   中英

JavaFX:基于TimerTask定期使用LabelProperty和ChangeListener更新标签

[英]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,它基于String来更改标签的文本:

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

您也可以尝试。 您需要一个可运行的设备来使其工作:

   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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM