2009-05-20 106 views
4

所以我在Java Swing中有這個漂亮的MVC架構的應用程序,現在我想添加一個進度條,並且我對好的設計方法感到困惑,以便將JProgressBar合併到我的視圖中。我應該:進度條+ Java中的MVC =?

  • 將DefaultBoundedRangeModel添加到我的控制器的狀態,並將其導出?

    class Model { 
        final private DefaultBoundedRangeModel progress 
        = new DefaultBoundedRangeModel(); 
    
        public void getProgressModel() { return progress; } 
        public void setProgressCount(int i) { progress.setValue(i); } 
    } 
    
    class Controller { 
        Model model; 
        int progressCount; 
        void doSomething() 
        { 
        model.setProgressCount(++progressCount); 
        } 
    } 
    
    class View { 
        void setup(Model m) 
        { 
        JProgressBar progressBar = /* get or create progress bar */ ; 
        progressBar.setModel(m.getProgressModel()); 
        } 
    } 
    
    /* dilemma: Model allows progress to be exported so technically 
    all of the progress state could be set by someone else; should it be put 
    into a read-only wrapper? */ 
    
  • 使用JGoodies數據綁定嘗試關於SpringLayout的視覺狀態連接到我的模型狀態?

    class Model { 
        private int progress; 
    
        public void getProgressCount() { return progress; } 
        public void setProgressCount(int i) { progress = i; } 
    } 
    
    class View { 
        void setup(Model m) 
        { 
        ProgressBar progressBar = /* get or create progress bar */ ; 
        CallSomeMagicMethodToConnect(m, "progressCount", progressBar, "value"); 
        // is there something that works like the above? 
        // how do I get it to automatically update??? 
        } 
    } 
    
  • 還是別的什麼?

編輯:更具體:可能有人點我現實源一個很好的例子在Java中具有包括一個進度條,一個狀態欄,並有一個體面的MVC實現它的一個應用程序?

回答

3

否(至1)和NOOOO(至2)。最起碼,我是這麼想的。

否(對1):首先,DefaultBoundedRangeModel是一個javax.swing類。在我看來,這些課程在模型中沒有地位。例如,想想服務器上的模型,通過RMI訪問 - 所有突然把javax.swing類放在那裏似乎「不正確」。然而,真正的問題在於,你將模型的一部分(有界模型)給予其他人,無法控制事件觸發或查詢。

否(至2):呃。綁定很有趣,但是(至少在我看來)應該用來在UI模型和UI組件之間進行同步,而不是在數據模型和UI模型之間進行同步。再次想一想,如果您的數據模型位於RMI訪問的遠程服務器上,會發生什麼情況。

那麼是什麼?那麼,這只是一個建議,但我會添加一個事件偵聽器接口並添加標準事件偵聽器訂閱方法(addListner(...),removeListener(...))。當我進行更新時,我會在模型中調用這些偵聽器。當然,爲了使客戶端(本例中的UI)能夠正確同步(invokeLater和朋友),我會確保記錄調用線程(或者說它不能被確定)。由於監聽器服務將被控制器公開,這將允許模型在任何地方居住(甚至允許遠程調用或合併監聽器)。此外,這將使模型與UI分離,從而可以構建包含它的更多模型(譯者/裝飾者/依賴模型)。

希望這會有所幫助。

+0

順便說一句,你應該看看SwingWorker的 - 它與這個問題涉及(從一個更新的進展後臺任務)。 – 2009-05-21 10:34:14

3

我會說,別的。

我用MVC的問題是定義模型的抽象級別。

  • 型號可能是某種對UI組件對象的

  • 型號也可能是一些其他類型的節目是自我的對象。

  • 模型可以高達的商業模式。

在這種情況下,我會爲進度條分開模型/組件對,並在單獨的控制器類中處理它們。

This article描述了擺動架構,並可能闡明它在內部使用模型的方式。

3

在我們的應用程序(MVC,約100 KLOC)我們有它這樣的(模式觀察,實際上):

/** 
* Observer on progress changes 
*/ 
public interface IProgressListener { 
    public void setProgress(ProgressEvent e); 
} 

public class ProgressEvent extends ... { 
    private int progressCount; 
    // setter + getter 
    ... 
} 

class Model { 
    public void addProgressListener(IProgressListener l); 
    protected void fireProgressChange(ProgressEvent e); // call .setProgress() on listeners 
} 

class Controller { 
    private Model model; 
} 

class View extends ProgressBar implements IProgressListener { 
    ... 
    // IProgressListener implementation 
    public void setProgress(ProgressEvent e) { 
    this.setValue(e.getProgress()); 
    } 
    ... 
}