当我想从其他线程将节点添加到我的 GUI 时,我遇到了问题。它抛出 IllegalStateException ,我不知道如何解决它。
public class DashBoardController implements Initializable {
@FXML
private FlowPane dashBoardPane;
@Override
public void initialize(URL url, ResourceBundle rb) {
try {
RTMClientV2 client = new RTMClientV2("localhost", 9009, new DashBoardArranger(this));
Thread clientTH = new Thread(client);
clientTH.start();
} catch (IOException ex) {
Logger.getLogger(DashBoardController.class.getName()).log(Level.SEVERE, null, ex);
}
}
public synchronized void addToDashBoard(Pane root){
dashBoardPane.getChildren().add(root);
}
}
我只是用这个控制器将我的 .FXML 文件加载到 GUI 中,当程序启动时,它运行负责与服务器通信的线程(clientTH.start();),一切正常。但是当服务器在初始化后发送数据时。我希望这些数据添加到我的仪表板中,我像以前一样使用方法 public synchronized void addToDashBoard(Pane root) ,但它抛出 java.lang.IllegalStateException ,我不知道为什么。
顺便说一句:我发现:“如果此父节点附加到场景,则只能在 JavaFX 应用程序线程上修改其子节点列表。如果违反此限制,则会引发 IllegalStateException。”,但它没有用为了我。仪表板被添加到我的 GUI 中的另一个窗格中。
顺便说一句:输出:
线程“Thread-4”java.lang.IllegalStateException 中的异常:不在 FX 应用程序线程上;currentThread = Thread-4
at com.sun.javafx.tk.Toolkit.checkFxUserThread(Unknown Source)
at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(Unknown Source)
at javafx.scene.Parent$1.onProposedChange(Unknown Source)
at com.sun.javafx.collections.VetoableObservableList.add(Unknown Source)
at com.sun.javafx.collections.ObservableListWrapper.add(Unknown Source)
at probeobserver.gui.probeSite.DashBoardController.addToDashBoard(DashBoardController.java:125 )
在probeobserver.gui.probeSite.DashBoardArranger.setCompName(DashBoardArranger.java:66)
在 probeobserver.rtm.RTMClientV2.readAllDataAndUpdate(RTMClientV2.java:144)
在 probeobserver.rtm.RTMClientV2.run(RTMClientV2.java:80)
在 java.lang.Thread.run(Thread.java:722)