我试图每秒更新一次标签使用一个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
更多推荐
发布评论