Discussion:
[問題] JProgressBar延遲
(时间太久无法回复)
xsd
2006-09-25 05:04:49 UTC
Permalink
我想問有關於JProgressBar的相關問題

// 以下是測試檔
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;

public class progress_test implements ActionListener{

private JFrame frame = new JFrame("視窗"); // 按扭主視窗
private JFrame f = new JFrame("進度"); // JProgressBar視窗
private JButton btn = new JButton("按扭");
private JProgressBar progressbar = new JProgressBar();

public progress_test() {
frame.setBounds(200,200,200,200);
frame.getContentPane().add(btn);

progressbar.setOrientation(JProgressBar.HORIZONTAL);
progressbar.setMinimum(0);
progressbar.setMaximum(100);
progressbar.setValue(0);
progressbar.setStringPainted(true);
progressbar.setPreferredSize(new Dimension(200,30));
progressbar.setBorderPainted(false);

btn.addActionListener(this);
frame.setVisible(true);
}

public void actionPerformed(ActionEvent ae) {
if(ae.getSource()==btn) {
new Thread(new Runnable() {
public void run()
{
f.getContentPane().add(progressbar);
f.setBounds(100,100,100,100);
f.setVisible(true);
progressbar.setVisible(true);
for (int i=0;i<=100;i++)
progressbar.setValue(i);

}
}).start();

// 此處進行資料庫的處理

frame.dispose();
}
}

public static void main(String[] args) {
new progress_test();
}
}

程式的執行是這樣子的 執行後 出現一個視窗 視窗上面有一個按扭

當按下後 則會進行資料庫的相關處理 如黃色註解那邊所示

而在進行資料庫的處理之前 先啟動了一個thread來做JProgressBar的運作

但是執行後 JProgressBar不會先出來 反倒是按住frame的button畫面會先定住

然後視窗f會出現 但是JProgressBar不會出現 然後待那些資料庫的處理完畢後

frame.dispose()之後,JProgressBar才出現。

我想問的就是 為什麼這個時候JProgressBar才出現呢?

有人遇過相關的問題嗎?

這個方法我是參考JavaWorld的方法,但是還是無法解決

網址:
http://www.javaworld.com.tw/jute/post/view?bid=5&id=69415&sty=3&age=0&tpg=1&ppg=1#69415



若我問的不好 請見諒

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.174.244.121
xsd
2006-09-25 06:05:40 UTC
Permalink
解決了

感謝H45的指導 謝謝了

(這樣的回文有違反版規嗎?有的話,抱歉了..)

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.174.244.121
!H45
2006-09-25 06:08:32 UTC
Permalink
※ 引述《HiEArO (xsd)》之銘言:
: 我想問有關於JProgressBar的相關問題
: // 以下是測試檔
: 程式的執行是這樣子的 執行後 出現一個視窗 視窗上面有一個按扭
: 當按下後 則會進行資料庫的相關處理 如黃色註解那邊所示
: 而在進行資料庫的處理之前 先啟動了一個thread來做JProgressBar的運作
: 但是執行後 JProgressBar不會先出來 反倒是按住frame的button畫面會先定住
: 然後視窗f會出現 但是JProgressBar不會出現 然後待那些資料庫的處理完畢後
: frame.dispose()之後,JProgressBar才出現。
: 我想問的就是 為什麼這個時候JProgressBar才出現呢?
: 有人遇過相關的問題嗎?
: 這個方法我是參考JavaWorld的方法,但是還是無法解決
: 網址:
: http://www.javaworld.com.tw/jute/post/view?bid=5&id=69415&sty=3&age=0&tpg=1&ppg=1#69415
: 若我問的不好 請見諒

原因:
AWT-Thread 呼叫 actionPerformed
另外,AWT-Thread 負責 repaint components
而 database 的處理時間特別長
所以才出現 JProgressBar 遲滯過久的問題

解決之道:
把 database 的處理也創一個 thread 來執行
盡快使 AWT-Thread 離開 actionPerformed method
才可以 repaint components

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.115.205.85

Loading...