2015-10-14 48 views
0

我幾個月前MY POSTJAVA:&JProgressBar的Files.copy具有觀察員和SwingWorker的第1類

寫了aricle但我想做出一些改變,以我。現在我所有的代碼是在SwingWorker的制定類。但我想使用MVC方法並使用觀察者模式更新視圖中的變量。

現在我有這樣的事情

public class CopyFrame extends JFrame { 

     private JTextarea textArea; 
     private JProgresbar progresbar; 

     public CopyFrame(){ 
      progresbar = new JProgresbar 
      textArea = new JTextarea(); 
      progresbar.setMaximum(100)); 
      /*in this method I added the components correctly*/ 
      addComponentsCorrecty(); 

      new Task().execute(); 
     } 


     class Task extends Swingworker<Void,Void>{ 
      /*Dp this 10 times*/ 
      Files.Copy(source, destination); 
      progresbar.setValue(progresbar.getValue + 10); 

      String info = String.format("%s is completed", source) 

     textArea.setText(textArea.getText + "\n" + info) 
     } 
    } 

,我想創造一些這樣的

public class CopyFrame extends JFrame { 

    private JTextarea textArea; 
    private JProgresbar progresbar; 

    public CopyFrame(){ 
     progresbar = new JProgresbar 
     textArea = new JTextarea(); 
     progresbar.setMaximum(100)); 
     /*in this method I added the components correctly*/ 
     addComponentsCorrecty(); 

     Task task = new Task(); 
     task.addObserver(this); 
     task.execute 
    } 

    @Override 
    public void update(){ 
     progresbar.setValue(progresbar.getValue +10); 
     textArea.setText(textArea.getText + "\n" + task.getInfo) 
    } 
} 
class Task extends Swingworker<Void,Void> extends Observer{ 

     private String info; 
     public Task(){ 
      doTask; 
     } 

     public void doTask(){ 
     /*Dp this 10 times*/ 
     Files.Copy(source, destination); 
     info = String.format("%s is completed", source) 
     setChanged(); 
     notifyObservers(); 
     } 

     public String getInfo(){ 
      return info; 
     } 
} 

我怎樣才能做到這一點?因爲我不能從2個班擴展。 我想更新從另一個類(TASK)的progresbar

什麼是

+0

'SwingWorker'提供了一個觀察者模式的一種形式,一個'PropertyChangeListener' – MadProgrammer

回答

1

SwingWorker提供的PropertyChangeListener形式的觀察者模式的一種形式我最好的選擇。

這提供有關狀態變化(運行/完成/等)和進度變化的通知。

例如:

變得有點厭了的世界資源研究所的婷PropertyChangeListener,我沒有創建一個簡單的適配器,它提供了更直接的事件通知

import java.beans.PropertyChangeEvent; 
import java.beans.PropertyChangeListener; 
import javax.swing.SwingWorker; 

public class SwingWorkerListener<W extends SwingWorker> implements PropertyChangeListener { 

    @Override 
    public void propertyChange(PropertyChangeEvent evt) { 
     W worker = (W) evt.getSource(); 
     switch (evt.getPropertyName()) { 
      case "state": 
       workerStateChanged(worker); 
       switch (worker.getState()) { 
        case STARTED: 
         workerStarted(worker); 
         break; 
        case DONE: 
         workerDone(worker); 
         break; 
       } 
       break; 
      case "progress": 
       workerProgressUpdated(worker); 
       break; 
     } 
    } 

    protected void workerProgressUpdated(W worker) { 
    } 

    protected void workerStateChanged(W worker) { 
    } 

    protected void workerStarted(W worker) { 
    } 

    protected void workerDone(W worker) { 
    } 

} 

這讓我覆蓋的方法,我是真正感興趣,並減少我必須保持的重複/鍋爐板代碼量寫

記住,搖擺基地「聽衆」實際上是一個觀察者模式的一種形式;)

+0

我不明白的形式它。我的propertyChange方法永遠不會被調用。您正在使用一個開關,但什麼是「狀態」和什麼是「進度」 –

+0

何時調用propertyChange方法? –

+0

1.您是否向'SwingWorker'添加了一個'PropertyChangeListener'? 2.當'state'或'progress'屬性被改變時,'propertyChanged'將被調用。 3.你是否將代碼與我鏈接的例子數量進行了比較? – MadProgrammer