2017-11-25 54 views
0

我每秒使用一个TimerTask其改变StringProperty的值试图一次更新标签:JavaFX的:更新标签定期根据TimerTask的使用StringProperty用的ChangeListener

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方法来运行这个操作,标签不定时更新。我如何实现每秒一次的更新?

+1

看一看这里:https://stackoverflow.com/a/16138351/4167500 – JKostikiadis

+0

@JKostikiadis非常感谢你,它就像一个魅力:)时间轴是一个非常强大的工具 – Kaes3kuch3n

回答

1

对于那些有兴趣的解决方案:使用一个时间表,而不是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

0

你也可以试试这个。你需要一个可运行,使其工作:

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