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ソース)
com.sun.javafx.collections.VetoableObservableList.add(不明なソース)
at com.sun.javafx.collections.ObservableListWrapper.add(不明なソース)
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 に答える