1

当我想从其他线程将节点添加到我的 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)

4

1 回答 1

4

在您的 I/O 线程中,您需要在 UI 线程中与 UI 交互:

Platform.runLater(new Runnable() {
    @Override
    public void run() {
        Pane root = ...; //if you set any properties of the pane, do it here.
        dashBoardController.addToDashBoard(root);
    }
}
于 2012-07-03T11:50:37.743 回答