Re: [問題] JButton的setEnable不work
※ 引述《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
推
03/19 02:57, , 1F
03/19 02:57, 1F
推
03/19 03:02, , 2F
03/19 03:02, 2F
不是 setEnabled 和 doSomething,
你該考慮的是 paint 和 actionPerformed。
※ 編輯: tkcn 來自: 114.34.7.189 (03/19 03:05)
推
03/19 03:13, , 3F
03/19 03:13, 3F
推
03/19 03:16, , 4F
03/19 03:16, 4F
→
03/19 03:17, , 5F
03/19 03:17, 5F
→
03/19 09:19, , 6F
03/19 09:19, 6F
→
03/19 09:24, , 7F
03/19 09:24, 7F
→
03/19 11:49, , 8F
03/19 11:49, 8F
推
03/19 14:36, , 9F
03/19 14:36, 9F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):