Re: [問題] Swing、GUI 即時更新
※ 引述《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
10/29 00:27, 2F
推
10/29 00:30, , 3F
10/29 00:30, 3F
推
10/29 08:17, , 4F
10/29 08:17, 4F
→
10/29 08:18, , 5F
10/29 08:18, 5F
→
10/29 11:10, , 6F
10/29 11:10, 6F
推
10/29 13:17, , 7F
10/29 13:17, 7F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 3 篇):