gpt4 book ai didi

multithreading - JavaFX 中的线程 : Not on FX application thread

转载 作者:行者123 更新时间:2023-12-03 12:45:28 31 4
gpt4 key购买 nike

我想研究如何在 JavaFX 中使用线程。例如,2 个进程,它们应该每 100 毫秒更改标签上的文本,并且每 100 毫秒更新屏幕上的信息。

但在这种情况下它不起作用。 IDEA 写道:

Exception in thread "Thread-4" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-4

我已经阅读了很多关于相同问题的例子,但是他们的任何解决方案都不起作用。

我该怎么办?

谢谢。

示例.fxml

...
<Button fx:id="startBut" layoutX="100.0" layoutY="50.0" mnemonicParsing="false" onAction="#testingOfThread" prefHeight="25.0" prefWidth="65.0" text="Export" />
<Label fx:id="firstStatus" layoutX="100.0" layoutY="100" text="Status" />
<Label fx:id="secondStatus" layoutX="100.0" layoutY="150" text="Status" />
...

主.java

package sample;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {

@Override
public void start(Stage primaryStage) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
primaryStage.setTitle("Sample");
primaryStage.setScene(new Scene(root));
primaryStage.show();
}

//Take control to Controller
public void initializeController(){
FXMLLoader loader = new FXMLLoader();
Controller controller = loader.getController();
controller.setMain(this);
}

public static void main(String[] args) {
launch(args);
}
}

Controller .java

package sample;

import javafx.concurrent.Task;
import javafx.fxml.FXML;
import javafx.scene.control.*;

public class Controller {

@FXML
private Label firstStatus;

@FXML
private Label secondStatus;

@FXML
public Button startBut;


//Link to MainApp
private Main Main;

//Constructor
public Controller(){
}


//Link for himself
public void setMain(Main main){
this.Main = main;
}

@FXML
private void testingOfThread(){

Task<Void> task = new Task<Void>() {
@Override public Void call() {
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
Thread.interrupted();
break;
}
System.out.println(i + 1);
firstStatus.setText(i+"");
}
return null;
}
};

Thread th = new Thread(task);
th.setDaemon(true);
th.start();


Task<Void> task2 = new Task<Void>() {
@Override public Void call() {
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
Thread.interrupted();
break;
}
System.out.println(i + 1);
secondStatus.setText(i+"");
}
return null;
}
};

Thread th2 = new Thread(task2);
th2.start();

}
}

最佳答案

从应用程序线程以外的线程中找到更新GUI的代码,然后将它们放在runLater()中。

Platform.runLater(new Runnable() {
@Override
public void run() {
//update application thread
}
});

关于multithreading - JavaFX 中的线程 : Not on FX application thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49343256/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com