私は、scenebuilderでJavaFXを使用してタイマーを作成しようとしていましたが、スレッドの作成にいくつか問題がありました。私がスタートボタンを押すたびに、アプリケーションは遅れてしまい、実際にテキストを更新することはありません。私はPlatform.runLater()
を使用しようとしていますが、上記のようにすべてが遅れて結果としてです。ここでJavaFXのタイマーのスレッドの問題
はFXMLファイル上の特定のボタンにリンクされ、タイマーを制御する方法である:
@FXML
private void startTimer(){
System.out.println("started");
stopWatch.startTimer();
}
@FXML
private void pauseTimer(){
stopWatch.pauseTimer();
}
@FXML
private void stopTimer(){
System.out.println("stopped");
stopWatch.stopTimer();
}
@FXML
public void updateTimer(long dT){
//System.out.println(((dT/6000)%1000)+":"+String.valueOf((dT/1000)%1000)+","+String.valueOf((dT)%1000));
Platform.runLater(() ->{
timer.setText(String.valueOf(dT/1000));
});
}
そして、ここではStopWatch.javaクラスです:
package sled.timer.address.model;
import sled.timer.address.view.PersonOverviewController;
public class StopWatch implements Runnable{
private Thread runThread;
public boolean running = false;
public boolean paused = false;
private long summedTime = 0;
PersonOverviewController personOverviewController;
String time = "";
public void count(){
}
public StopWatch(PersonOverviewController personOverviewController){
this.personOverviewController = personOverviewController;
}
public void startTimer(){
running = true;
paused = false;
runThread = new Thread(this);
runThread.start();
}
public void pauseTimer(){
paused = true;
}
public void stopTimer(){
running = false;
paused = false;
}
@Override
public void run() {
// TODO Auto-generated method stub
long startTime = System.currentTimeMillis();
while(running && !paused){
personOverviewController.updateTimer(summedTime + (System.currentTimeMillis() - startTime));
}
if(paused)
summedTime += System.currentTimeMillis() - startTime;
else
summedTime = 0;
}
public long getSummedTime(){
return summedTime;
}
すべてのヘルプは高く評価されます。