第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

避免不在 FX 應用程序線程上導致 UI 崩潰

避免不在 FX 應用程序線程上導致 UI 崩潰

天涯盡頭無女友 2021-11-24 15:30:23
我正在使用 JavaFX 制作一個循序漸進的游戲,我正在使用 do while 循環(huán)來等待用戶輸入。問題是,它是從 fxml 控制器初始化方法調(diào)用的,這意味著接口永遠不會加載。解決方案是使用另一個線程等待,但 JavaFX 不允許從輔助線程修改任何節(jié)點。我使用以下代碼避免了“不在 FX 應用程序線程上”:public void initialize(URL arg0, ResourceBundle arg1) {        // I call the game engine to start the game sequence and I pass root into it for further use        engine = new GameEngine(root);        Platform.runLater(new Runnable() {            @Override            public void run() {                engine.start();            }          });    }內(nèi)部 engine.start() 方法:public void start() {        System.out.println("Game started");        text("Hello, stranger"); // a new Label inside VBox        do {            try {                Thread.sleep((long) 1000);                System.out.println("Sleeping...");            } catch (InterruptedException e) {                // TODO Auto-generated catch block                e.printStackTrace();                System.out.println("Error... waiting?");            }        } while(this.listener == false); // Listener triggers when user inputs.        System.out.println("ENTER PRESSED, May proceed");        text("It worked!");    }此外,GameEngine 擴展了 Thread,我不知道它如何影響多線程之外的任何事情。當代碼啟動時,UI 崩潰,輸出顯示 Sleeping... 每一秒都應該如此。
查看完整描述

2 回答

?
慕容3067478

TA貢獻1773條經(jīng)驗 獲得超3個贊

您不能在 JavaFX 應用程序線程上調(diào)用Thread.sleep()和/或while循環(huán),因為這會導致 GUI 停止并等待循環(huán)結束。

解決方案是使用另一個線程等待,但 JavaFX 不允許從輔助線程修改任何節(jié)點。

是的,您不應該從非 JavaFX 應用程序線程修改場景圖,但這并不能阻止您調(diào)用Platform.runLater()進行實際修改的代碼行。您也可以使用Task來實現(xiàn)這一點。

很難提供任何具體的解決方案,因為我不知道listenerflag 是如何更新的。

編輯

直到 fabian 指出,我才注意到該start()方法屬于一個Thread子類。你永遠不應該覆蓋Thread.start(),更糟糕的是,super.start()當你覆蓋它時不要調(diào)用。

所以這里發(fā)生的事情是你的GameEngine類不再像Thread. 調(diào)用engine.start()只是在調(diào)用的線程中執(zhí)行您在覆蓋中編寫的任何代碼engine.start()(恰好是 JavaFX 應用程序線程,因為您已將其包裝在 a 中Platform.runLater())。

如果您仍然喜歡擴展Thread,那么您應該將代碼移動到覆蓋Thread.run()。另請注意,您應該刪除Platform.runLater()in initialize(),并將其放在會影響 GUI 的任何代碼中。

例如:

Platform.runLater(() -> {
    myLabel.setText("User typed" + input);
    });


查看完整回答
反對 回復 2021-11-24
?
慕萊塢森

TA貢獻1810條經(jīng)驗 獲得超4個贊

基本上,使用多線程必須是明智的。一個線程在主線程編輯布局時等待。推桿


Platform.runLater(() -> {

  // layout manipulations 

});

如果在主線程之外,則圍繞布局操作按預期工作。


查看完整回答
反對 回復 2021-11-24
  • 2 回答
  • 0 關注
  • 199 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號