gpt4 book ai didi

JavaFX .getChildren().add(root) 抛出 java.lang.IllegalStateException

转载 作者:行者123 更新时间:2023-11-29 03:45:09 25 4
gpt4 key购买 nike

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

我只是用这个 Controller 将我的 .FXML 文件加载到 GUI,当程序启动时,它运行负责与服务器通信的线程 (clientTH.start();),一切正常。但是当服务器在初始化后发送数据时。我希望将此数据添加到我的仪表板,我像以前一样使用方法 public synchronized void addToDashBoard(Pane root),但它抛出 java.lang.IllegalStateException,我不知道为什么。

顺便说一句:我发现了这个:“如果这个父节点附加到一个场景,那么它的子节点列表只能在 JavaFX 应用程序线程上修改。如果违反此限制,则会抛出 IllegalStateException。”,但它对我没用。仪表板已添加到我的 GUI 中的另一个 Pane 。

顺便说一句:输出:

Exception in thread "Thread-4" java.lang.IllegalStateException: Not on FX application thread; 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)
at probeobserver.gui.probeSite.DashBoardArranger.setCompName(DashBoardArranger.java:66)
at probeobserver.rtm.RTMClientV2.readAllDataAndUpdate(RTMClientV2.java:144)
at probeobserver.rtm.RTMClientV2.run(RTMClientV2.java:80)
at java.lang.Thread.run(Thread.java:722)

最佳答案

在您的 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);
}
}

关于JavaFX .getChildren().add(root) 抛出 java.lang.IllegalStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11310194/

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