作者sbrhsieh (偶尔想摆烂一下)
看板java
标题Re: [问题] Swing、GUI 即时更新
时间Thu Oct 29 00:05:44 2009
※ 引述《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
1F:推 KanoLoa:太感谢了,我先去研究一下 10/29 00:25
3F:推 KanoLoa:哇哦,大感谢m(_ _)m (另外道歉一下我查版不够努力) 10/29 00:30
4F:推 PsMonkey:你的问题算是作 Swing 的基本 FAQ,不过标题通常就.... 10/29 08:17
5F:→ PsMonkey:所以算正常啦... [拍拍] 10/29 08:18
6F:→ kanandg1:第二个例子里 原PO用了第二条thread,结果一样? 10/29 11:10
7F:推 KanoLoa:我解决问题了,方法是在按钮方法里面新增执行绪动作 10/29 13:17