我的JavaFX应用程序遇到了一些问题。我目前正在创建一个音乐播放器,我底部有一个滑块(类似于Spotify),它应根据歌曲的持续时间移动。
问题是我的代码在使用此线程代码时会滞后。它获取歌曲的当前持续时间,然后在进入睡眠状态1000 ms之前设置durationSlider的值。
有没有人知道解决这个滞后问题的方法?代码仍然每秒运行,但我的GUI滞后,我完全无法做任何事情。
public void startCounting(){
mediaPlayer.setOnPlaying(new Thread() {
@Override
public void run() {
Duration a;
while (mediaPlayer.getStatus().equals(MediaPlayer.Status.PLAYING)) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("Shit aint workin bro");
}
a = mediaPlayer.getCurrentTime();
int currentTime = (int) a.toSeconds();
System.out.println(currentTime);
durationSlider.setValue(50.0); //Testing the setValue() method
}
}
});
}
答案 0 :(得分:2)
您基本上停止了UI线程,因为使用onPlaying
方法调用了run
,而不是start
Thread
方法。相反,您应该传递Runnable
来创建新的Thread
并在其上调用start
。请注意,正如@AntJavaDev所说,在这种情况下,应使用Platform.runLater
对UI进行所有更改:
mediaPlayer.setOnPlaying(()-> {
Thread th = new Thread() {
@Override
public void run() {
Duration a;
while (mediaPlayer.getStatus().equals(MediaPlayer.Status.PLAYING)) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("Shit aint workin bro");
}
a = mediaPlayer.getCurrentTime();
int currentTime = (int) a.toSeconds();
System.out.println(currentTime);
Platform.runLater(() -> durationSlider.setValue(50.0)); //Testing the setValue() method
}
};
th.start();
});
您可能希望保存此Thread
实例,以便在onStopped
等中与其进行交互,或者将其设置为守护程序线程,因此它不会禁止程序关闭。