Re: [問題] Swing、GUI 即時更新

看板java作者 (偶爾想擺爛一下)時間16年前 (2009/10/29 00:05), 編輯推噓4(403)
留言7則, 4人參與, 最新討論串2/3 (看更多)
※ 引述《KanoLoa (卡)》之銘言: : 我寫了一個GUI,用來對機器人下指令和監控參數。 : 當我按下前進鈕的時候,機器人會往前走五秒。 : 然後GUI要在機器人前進的時候, : 依然能夠取得機器人的某個參數,(例如感測器的參數 : 好讓我能夠在GUI上面更新參數訊息。 : 1.於是我在機器人往前走的程式碼裡面, : 加上一段更新GUI的參數欄位的程式碼: : while(不到5秒){ : 走路(); : GUI.SetTextArea(參數); ← 就這行 : 計時(); : } : 這樣的結果就是得等機器人走完那五秒, : 停下後他才去更新GUI,完全不理會正常程序的步驟。 從你描述的情況來看幾乎可以確定你是把上面這段碼放在 event handler method 裡,比如這段碼直接出現在某個 ActionListener 的 actionPerformed method 裡, 當 ActionListener 監視的 button 被點擊,actionPerformed 會在 event- dispatching thread(後稱 EDT)裡被 callback(簡言之,actionPerformed method 會在 EDT 執行)。 程式變更 UI component 的狀態(理論上都應該在 EDT 裡變更 component 狀態), 導致 component 會變更(更新)外觀,這個重繪製外觀的動作最後會在 EDT 裡執行。 那麼當上述片段碼中的 while loop 在 EDT 裡執行,只要這個 while loop 沒有結 束,任一個 component 的外觀都無法更新。 : 2.我用一個Thread,每秒去取得機器人的參數,然後更新GUI: : run() : { : while(1) : { : X = 取得機器人參數(); : GUI.SetTextArea(X); : 等一秒(); : } : } : 結果依然一樣,只要機器人在做任何動作的時候, : GUI的介面更新就被放在最後,即使我要求先更新在動作。 理由同上一段。 花點時間翻翻版上的舊文,或是到 www.javaworld.com.tw 檢索 "event-dispatching thread" or "UI Thread",應該可以找到很多篇相同的問題(描述問題的方式不同, 但道理相同)與相關的說明。希望對你有幫助。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.173.140.132

10/29 00:25, , 1F
太感謝了,我先去研究一下
10/29 00:25, 1F

10/29 00:27, , 2F
比如這篇舊文:#1AHoSjmJ
10/29 00:27, 2F

10/29 00:30, , 3F
哇哦,大感謝m(_ _)m (另外道歉一下我查版不夠努力)
10/29 00:30, 3F

10/29 08:17, , 4F
你的問題算是作 Swing 的基本 FAQ,不過標題通常就....
10/29 08:17, 4F

10/29 08:18, , 5F
所以算正常啦... [拍拍]
10/29 08:18, 5F

10/29 11:10, , 6F
第二個例子裡 原PO用了第二條thread,結果一樣?
10/29 11:10, 6F

10/29 13:17, , 7F
我解決問題了,方法是在按鈕方法裡面新增執行緒動作
10/29 13:17, 7F
文章代碼(AID): #1Aw6lR0p (java)
文章代碼(AID): #1Aw6lR0p (java)