作者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
推 mrker:我比較好奇的是AWTQUEUE丟進去的順序,是先setEnabled 03/19 02:57
推 mrker:再doSomething,而第一個setEnabled觸發重繪,又排到Queue? 03/19 03:02
不是 setEnabled 和 doSomething,
你該考慮的是 paint 和 actionPerformed。
※ 編輯: tkcn 來自: 114.34.7.189 (03/19 03:05)
推 mrker:所以是Ul執行緒將actionPerform丟進Queue排隊 03/19 03:13
推 mrker:1第一個setEnabled觸發重繪,又排到Queue? 03/19 03:16
→ mrker:所以等到doSomething(actionPeform)做完才重繪? 03/19 03:17
→ adrianshum:補充一下,我在 #1F5fUNqQ 有談過,原問者可以配合看 03/19 09:19
→ PsMonkey:對不起... 我太弱了...... [準備切腹] 03/19 09:24
→ tkcn:先岔個題,是 UI 不是 Ul 03/19 11:49
推 mrker:哈我用手機手寫的,所以打錯看不出來,謝謝兩位的解答!! 03/19 14:36