我程序的工作方式,当按下按钮时,有一个方法被调用。然后,我的想法是,我有一个新线程,该线程具有一个while循环,该循环每隔指定的时间调用另一个方法,直到再次按下切换按钮。我将如何编程这样的东西?我尝试了Thread.wait(),但它导致GUI更新问题。
已解决。谢谢!
您可以尝试将Thread
对象保存到全局变量,并在再次按下toggleButton
时将其停止。
在线程上使用wait
方法将不起作用,因为wait
不能像您期望的那样起作用(请参阅Object.wait() in javadoc)
第二个问题(IllegalStateException:不在FX应用程序线程上)可能是由于方法performAction(ActionEvent)
引起的,因为它试图更改GUI中的内容,这是除应用程序线程之外的其他线程所不允许的。为避免这种情况,您可以使用Platform.runLater(Runnable)
(请参阅javadock或this post)
解决方案可能看起来像这样:
private Thread thread;
//call this method every time the toggle button is pressed
private void play(final ActionEvent ae) {
if (thread == null) {
//start in a new thread
thread = new Thread(new Runnable() {//better add a runnable to the new Thread than overwriting the run method of Thread
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {//run until the thread is interrupted
try {
Thread.sleep(speed);
//run this in platform to avoid the IllegalStateException that no fx thread is used
Plaform.runLater(() -> performAction(ae));
}
catch (InterruptedException e) {
//e.printStackTrace();
//set the interrupted flag again (was unset when exception was caught)
Thread.currentThread().interrupt();
}
}
}
});
thread.start();
}
else {
//stop the current thread
thread.interrupt();
thread = null;
}
}