进度条+;Java中的MVC=?

进度条+;Java中的MVC=?,java,model-view-controller,swing,progress-bar,Java,Model View Controller,Swing,Progress Bar,所以我在JavaSwing中有了这个漂亮的、漂亮的MVC架构的应用程序,现在我想添加一个进度条,我对将JProgressBar合并到我的视图中的好的设计方法感到困惑。我应该: 将DefaultBoundedRangeModel添加到控制器的状态,然后将其导出 class Model { final private DefaultBoundedRangeModel progress = new DefaultBoundedRangeModel(); public void ge

所以我在JavaSwing中有了这个漂亮的、漂亮的MVC架构的应用程序,现在我想添加一个进度条,我对将JProgressBar合并到我的视图中的好的设计方法感到困惑。我应该:

  • 将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绑定尝试将JProgressBar的可视状态连接到我的模型的状态

    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实现

我在MVC中遇到的问题是定义模型的抽象级别

  • 模型可以是UI组件的某种对象

  • 模型也可以是程序本身的其他类型的对象

  • 模型可以和商业模型一样高
在本例中,我将为进度条分离模型/组件对,并在单独的控制器类中处理它们

描述了swing体系结构,并可能阐明它在内部使用模型的方式

No(对1)和NOOOO(对2)。至少在我看来是这样

否(对1):首先,DefaultBoundedRangeModel是一个javax.swing类。在我看来,这些类在模型中没有位置。例如,想象一下服务器上的模型,通过RMI访问——突然之间,将javax.swing类放在那里似乎“不对”。 然而,真正的问题是,您将模型的一部分(有界模型)提供给了其他人,而无法控制触发的事件或进行的查询

不(对2):啊。绑定很有趣,但(至少在我看来)应该用于在UI模型和UI组件之间进行同步,而不是在数据模型和UI模型之间进行同步。再想一想,如果您的数据模型位于远程服务器上,由RMI访问,会发生什么情况

那又怎样?嗯,这只是一个建议,但我会添加一个事件侦听器接口,并添加标准的事件侦听器订阅方法(addListner(…),RemovelListener(…)。当我进行更新时,我会从模型中调用这些侦听器。当然,我会确保记录调用线程(或者说它无法确定),以便客户端(本例中的UI)能够正确同步(invokeLater和friends)。由于监听器服务将由控制器公开,这将允许模型在任何地方活动(甚至允许远程调用或汇集监听器)。此外,这将使模型与UI分离,从而可以构建更多包含它的模型(转换器/装饰器/依赖模型)

希望这能有所帮助。

在我们的应用程序(MVC,大约100 KLOC)中,我们有这样的功能(实际上是模式观察者):


顺便说一句,你应该看看SwingWorker——它专门处理这个问题(从后台任务更新进度)。
/**
 * 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());
  }
  ...
}