2012-09-07 78 views
1

我在a.java類(表單中)有一個progressbar。我需要從b.java類到達它。 我的進度條名稱是jprog。(我把它放在palet的表格中) 如何設置公開我的進度條?我無法在屬性頁面中找到它。 我的progressbarr在第一類。但我想改變它的價值在二等。 謝謝。我怎樣才能達到不同班級的進度條?

回答

1

考慮在第二堂課中增加一個PropertyChangeListener到您的第一堂課並且使用SwingWorker。 SwingWorker有一個名爲setProgress()的方法,您可以調用它來設置進度條的值。然後,您可以重寫propertyChange()方法在頭等艙和做這樣的事情:

public void propertyChange(PropertyChangeEvent evt) { 
    if ("progress" == evt.getPropertyName()) { 
     int progress = (Integer) evt.getNewValue(); 
     progressBar.setValue(progress); 
    } 
} 

使用幾個類,ClassA的ClassB的可以如下的例子:

public ClassA extends JForm implements PropertyChangeListener{ 
    private JProgressBar progressBar; 

    public ClassA(){ 
     /** 
     * Your setup for the form 
     */ 
    } 

    /** 
    * Invoked when task's progress property changes. 
    */ 
    public void propertyChange(PropertyChangeEvent evt) { 
     if ("progress" == evt.getPropertyName()) { 
      int progress = (Integer) evt.getNewValue(); 
      progressBar.setValue(progress); 
     } 
    } 

    public void someMethod(){ 
     ClassB classB = new ClassB(); 
     classB.addPropertyChangeListener(this); 
     classB.execute(); 
    } 
} 

class ClassB extends SwingWorker<Void, Void> { 
     /* 
     * Main task. Executed in background thread. 
     */ 
     @Override 
     public Void doInBackground() { 
      Random random = new Random(); 
      int progress = 0; 
      //Initialize progress property. 
      setProgress(0); 
      //Sleep for at least one second to simulate "startup". 
      try { 
       Thread.sleep(1000 + random.nextInt(2000)); 
      } catch (InterruptedException ignore) {} 
      while (progress < 100) { 
       //Sleep for up to one second. 
       try { 
        Thread.sleep(random.nextInt(1000)); 
       } catch (InterruptedException ignore) {} 
       //Make random progress. 
       progress += random.nextInt(10); 
       setProgress(Math.min(progress, 100)); 
      } 
      return null; 
     } 
} 
+0

我的progressbarr在第一類。但我想改變它的價值在二等 –

+0

@ErsinGulbahar:我更新了我的答案,展示瞭如何實現這一目標。請注意,我的'ClassA'是一個包含'JProgressBar'的值,我想根據特定的條件從另一個'ClassB'類更新它的值。希望這有助於:) – Sujay

+0

@Sujay我試過在我的代碼中使用這種方式,但不同之處在於classB.execute();當我按下ClassA的按鈕時會被調用。該按鈕保持切換直到我的任務完成,最後progressBar立即達到100%。我的問題是什麼? – dervish

1

您可以添加到您的類方法,將更新進度欄。然後你不必直接觸摸進度條。

+0

的更新我不明白你mean.pleas explan是 –

+0

你能解釋事件指派線程的上下文中執行的操作是很重要的? –

0

如果你想更新進度條,而你需要通過按下ClassA上的按鈕來完成它,我仍然建議Sujay的解決方案,但是你需要使用Runnable上下文來調用你的方法。爲了避免可能會阻止進度

public void someMethod(){ 
    EventQueue.invokeLater(new Runnable() { 

     @Override 
     public void run() { 

      // Some stuff 
      classB.addPropertyChangeListener(this); 
      classB.execute(); 

     } 
    }); 

}