2017-11-25 53 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); 
}