2010-04-28 70 views
2

如何從另一個線程更新JProgressBar.setValue(int)? 我的第二個目標是儘可能少地使用它。從新主題更新JProgressBar

這裏是我現在所擁有的代碼:

// Part of the main class.... 
pp.addActionListener(
     new ActionListener(){ 
      public void actionPerformed(ActionEvent event){ 
       new Thread(new Task(sd.getValue())).start(); 
      } 
     }); 

public class Task implements Runnable { 
    int val; 
    public Task(int value){ 
     this.val = value; 
    } 

    @Override 
    public void run() { 
     for (int i = 0; i <= value; i++){ // Progressively increment variable i 
      pbar.setValue(i); // Set value 
      pbar.repaint(); // Refresh graphics 
      try{Thread.sleep(50);} // Sleep 50 milliseconds 
      catch (InterruptedException err){} 
     } 
    } 
} 

頁是一個JButton,並單擊將JButton時啓動新線程。

pbar是Main類中的JProgressBar對象。

如何更新它的價值?(進度)

在運行上面的代碼()無法看到PBAR。

回答

3

始終遵守擺動的規則

一旦Swing組件已經實現,所有的代碼,可能應該在事件派發執行對組件的狀態影響或依賴線。

你可以做的是創建一個觀察者來更新你的進度條 - 如 - 在這個例子中,你想顯示點擊按鈕時加載的數據的進度。 DemoHelper類實現Observable,並在加載某些百分比的數據時向所有觀察者發送更新。 進度條通過public void update(Observable o, Object arg) {

class PopulateAction implements ActionListener, Observer { 

    JTable tableToRefresh; 
    JProgressBar progressBar; 
    JButton sourceButton; 
    DemoHelper helper; 
    public PopulateAction(JTable tableToRefresh, JProgressBar progressBarToUpdate) { 
     this.tableToRefresh = tableToRefresh; 
     this.progressBar = progressBarToUpdate; 
    } 

    public void actionPerformed(ActionEvent e) { 
     helper = DemoHelper.getDemoHelper(); 
     helper.addObserver(this); 
     sourceButton = ((JButton) e.getSource()); 
     sourceButton.setEnabled(false); 
     helper.insertData(); 
    } 

    public void update(Observable o, Object arg) { 
     progressBar.setValue(helper.getPercentage()); 
    } 
} 

無恥插件更新:這是從source from my demo project 隨意瀏覽更多的細節。

0

你不應該在事件派發線程之外做任何Swing的東西。要訪問它,你需要在運行時用你的代碼創建一個Runnable,然後把它傳遞給SwingUtilities.invokeNow()或SwingUtilities.invokeLater()。問題是我們需要延遲JProgressBar檢查以避免干擾Swing線程。爲此,我們需要一個Timer,它將在其自己的Runnable中調用invokeNow或更高版本。有關更多詳細信息,請參見http://www.javapractices.com/topic/TopicAction.do?Id=160

0
  • 有沒有必要顯式調用pbra.repaint。
  • 更新JProgressBar應通過GUI調度線程完成。

SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     // Remember to make pbar final variable. 
     pbar.setValue(i); 
    } 
});