作者tkcn (say)
看板java
标题Re: [问题] JButton的setEnable不work
时间Tue Mar 19 02:43:07 2013
※ 引述《mrker (ꬮ....)》之铭言:
: 最近在写UI的时候发生很无法理解的状况
: this.execute_jBtn.addActionListener(new ActionListener() {
: @Override
: public void actionPerformed(ActionEvent e) {
: execute_jBtn.setEnable(false);
: doSomething(); // 处理某些事情
: execute_jBtn.setEnable(true);
: }
: });
: 当execute_jBtn被按下时,我预期他会先disable,然後做某些事,最後再启用
: 可是事实上按下时按键并不会disable
: 如果把doSomething()拿掉似乎就可以....
我猜 doSomething() 是个花时间的操作,
而你判断有没有 setEnable"d" 只是观察 button 的颜色?
首先你需要知道:
http://goo.gl/t3bHe
其中 event dispatch thread 会负责处理 event-handling,以及 UI 的更新。
更具体的说法就是,它会不断的从 queue 中拿工作出来做,
做完一项才会拿下一项。
而 btn.setEnabled() 并不会即时更新画面,
它只会呼叫 repaint(),然後把重绘的工作加进 queue 里头。
而你的 doSomething() 还在做事,
也就是说目前的工作还没完成,所以当然也不会有重绘的动作。
等到 doSomething() 做完,能够重绘的时候,
画出来的也是 setEnabled(true) 时的状态了。
: 再来,如果actionPerformed里面new一个执行绪去做,似乎就可以
: this.execute_jBtn.addActionListener(new ActionListener() {
: @Override
: public void actionPerformed(ActionEvent e) {
: new Thread() {
: @Override
: public void run() {
: execute_jBtn.setEnable(false);
: doSomething(); // 处理某些事情
: execute_jBtn.setEnable(true);
: }
: }.start();
: };
: });
多了个 thread 跑 doSomething(),event dispatch thread 空着,
当然就没问题罗。
至於更正确的解法,只要看完上述网页你就会有答案了。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.34.7.189
1F:推 mrker:我比较好奇的是AWTQUEUE丢进去的顺序,是先setEnabled 03/19 02:57
2F:推 mrker:再doSomething,而第一个setEnabled触发重绘,又排到Queue? 03/19 03:02
不是 setEnabled 和 doSomething,
你该考虑的是 paint 和 actionPerformed。
※ 编辑: tkcn 来自: 114.34.7.189 (03/19 03:05)
3F:推 mrker:所以是Ul执行绪将actionPerform丢进Queue排队 03/19 03:13
4F:推 mrker:1第一个setEnabled触发重绘,又排到Queue? 03/19 03:16
5F:→ mrker:所以等到doSomething(actionPeform)做完才重绘? 03/19 03:17
6F:→ adrianshum:补充一下,我在 #1F5fUNqQ 有谈过,原问者可以配合看 03/19 09:19
7F:→ PsMonkey:对不起... 我太弱了...... [准备切腹] 03/19 09:24
8F:→ tkcn:先岔个题,是 UI 不是 Ul 03/19 11:49
9F:推 mrker:哈我用手机手写的,所以打错看不出来,谢谢两位的解答!! 03/19 14:36