java - 进度条 + Java 中的 MVC =?

标签 java model-view-controller swing progress-bar

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

  • 将 DefaultBoundedRangeModel 添加到我的 Controller 状态,然后将其导出?

    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 Binding 尝试将 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 实现?

最佳答案

否(对 1)和 NOOOO(对 2)。至少在我看来。

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

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

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

希望这对您有所帮助。

关于java - 进度条 + Java 中的 MVC =?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/889551/

相关文章:

java - 将子字符串替换为 StringBuffer 子字符串

java - Spring Data Neo4j SDN 4 审计支持

java - 二维数组无法正确输入

java - 自定义 TableHeaderUI 破坏了自定义 TableRowSorter

java - KeyListener - 为什么 keyPressed 方法会延迟一种类型?

java - 为什么这个 GUI 应用程序不向我显示图像?

java - 如何在 Java 中获取 XACML 控制台打印

java - 找不到媒体类型 = 文本/html 的 MessageBodyWriter 但适用于 JSON

php - Codeigniter 多个 Controller 与许多方法?

javascript - 类似 Ext JS Feed 查看器的功能