JavaFX:使用带有ChangeListener的StringProperty定期基于TimerTask更新标签(JavaFX: Update Label regularly based on Ti

编程入门 行业动态 更新时间:2024-10-26 15:13:45
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); }

为了更新标签,我添加了一个ChangeListener给StringProperty,它根据字符串更改标签的文本:

randomString.randomStringProperty().addListener( (observable, oldValue, newValue) -> Platform.runLater(() -> label.setText(newValue) ));

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

I'm trying to update a label once per second using a TimerTask which changes the value of a 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); }

To update the label I've added a ChangeListener to the StringProperty which changes the label's text based on the String:

randomString.randomStringProperty().addListener( (observable, oldValue, newValue) -> Platform.runLater(() -> label.setText(newValue) ));

But since I have to run this operation using the runLater method, the label isn't updated regularly. How do I achieve an update that occurs once a second?

最满意答案

对于那些对解决方案感兴趣的人:使用时间轴而不是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

For those interested in the solution: Using a timeline instead of the TimerTask works perfectly fine:

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

Thanks to @JKostikiadis for sharing this post: https://stackoverflow.com/a/16138351/4167500

更多推荐

本文发布于:2023-08-04 16:45:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1417900.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:标签   StringProperty   TimerTask   JavaFX   ChangeListener

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!