两次按下ToggleButton时,无法在自定义线程中执行while循环(仅在第一次时有效)

问题描述 投票:1回答:1

我程序的工作方式,当按下按钮时,有一个方法被调用。然后,我的想法是,我有一个新线程,该线程具有一个while循环,该循环每隔指定的时间调用另一个方法,直到再次按下切换按钮。我将如何编程这样的东西?我尝试了Thread.wait(),但它导致GUI更新问题。

已解决。谢谢!

java javafx fxml
1个回答
1
投票

您可以尝试将Thread对象保存到全局变量,并在再次按下toggleButton时将其停止。

在线程上使用wait方法将不起作用,因为wait不能像您期望的那样起作用(请参阅Object.wait() in javadoc

第二个问题(IllegalStateException:不在FX应用程序线程上)可能是由于方法performAction(ActionEvent)引起的,因为它试图更改GUI中的内容,这是除应用程序线程之外的其他线程所不允许的。为避免这种情况,您可以使用Platform.runLater(Runnable)(请参阅javadockthis 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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.