【问题标题】:Programming with a Java MVC approach using NetBeans GUI builder使用 NetBeans GUI builder 使用 Java MVC 方法进行编程
【发布时间】:2013-01-08 16:36:06
【问题描述】:

我的任务是制作一个 GUI,它基本上需要一些用户输入,并在运行程序的机器可访问的各种驱动器上进行一些文件夹/文件操作。在设计这个 GUI 时,我开始意识到 MVC 将使我的生活和其他决定修改代码的人变得更轻松,但我真的不知道如何通过 NetBeans 来完成。

我已经阅读了有关此主题的一些内容,但对于这是否可以在 NetBeans 上完成,我真的看不到任何明确的答案。如果我以编程方式构建 GUI,当然可以做到这一点,但这在某种程度上违背了我选择使用 NetBeans 的目的。

【问题讨论】:

    标签: java swing model-view-controller netbeans


    【解决方案1】:

    Netbeans 可以做到这一点。

    要意识到的关键是,虽然所有基本的 Swing 组件都是 MVC,但在大多数情况下,您不会以这种方式与它们交互。一个简单的文本字段有它的内部模型,但那个模型不是你的模型,文本字段更像是一个原始模型。

    您的模型处理更高级别的事件(按钮操作等),而不是按钮按下、箭头移动和鼠标点击。

    因此,对于高级 MVC,主要的通信机制是通过 PropertyChangeListeners。构建应用程序的基本任务是将各种数据元素的 PCL 及其 GUI 组件连接在一起。

    例如,一个简单的情况是您有一个项目列表。该列表通过 JTable 呈现在屏幕上,并且该表位于 JPanel 上。

    您的列表有它自己的模型,即它不仅仅是一个 Java 列表。它不是一个列表,因为标准 Java 列表不支持 PCL 通知。但是你的模型显然会包装这样一个列表。

    现在,下一个问题是如何连接 JTable 以与 List 模型关联。

    第一,您可以继承 JTable 并将其绑定到您的模型。或者,更简单地说,您将 JTable 用作原语,并让封闭的 JPanel 管理您的模型和 JTable 之间的交互。

    这意味着让您的 JPanel 实现 PropertyChangeListener,然后在连接所有内容时,您执行以下操作:

    ListModel myModel = new ListModel();
    ListPanel myPanel = new ListPanel();
    myModel.addPropertyChangeListener(myPanel);
    

    现在,每当您的 ListModel 发生更改时,都会通知 ListPanel。

    在您的 ListPanel 上,您可以使用以下内容:

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        if (evt.getPropertyName().equals(ListModel.CHANGED)) {
            ListModel model = (ListModel) evt.getSource();
            DefaultTableModel tm = (DefaultTableModel) listTable.getModel();
            tm.setRowCount(0);
            for (String s : model.getList()) {
                tm.addRow(new Object[]{s});
            }
        }
    }
    

    现在,您可以看到这只是重新加载整个表格模型,但您可以根据需要对属性进行细粒度更改。您还可以看到,如果这是其他模型(例如 Person 或其他模型),您可以在面板上填充单个文本字段等。

    这是一个非常简单的 GUI,但它显示了所有这些连接在一起的基本原理。我认为这在 Swing 示例中丢失了一些,这些示例非常适合一个面板屏幕,但当您开始添加其他视图时根本不会缩放。

    你的 JPanel 基本上变成了组合的 VC,随着你的 GUI 变得复杂,你可以把这些东西排除在外,但它对于合理数量的屏幕等来说效果很好。

    【讨论】:

    • 我已经开始重新组织我的代码,我实际上是在组合模型和控制器,同时保持视图分离。这是不被接受的吗?该模型一点也不复杂,而且我真的没有看到这段代码被重用。
    • 在 30,000 英尺处,该模型是 MVC 系统中更通用且可重用的部分。 V 和 C 有比没有更紧密结合的趋势。只是世界的方式。但这就是说,做让你顺流而下的事情。如果它是一种痛苦,它很快就会显现出来。如果没有,那显然不用担心。
    【解决方案2】:

    Netbeans 可以通过两种方式帮助您利用其代码库:GUI Builder (1) 和 NB Platform (2)。

    (1) Netbeans 曾经是 Java 世界中更好的拖放式 GUI 构建器之一,代号为 Matisse

    也就是说,我已经很久没有使用它了——而且我从来都不喜欢生成的代码,它不是很容易理解(这当然不是自动生成代码的目的)。对于更复杂的 UI,我们手动编写了布局,而且工作还算可以接受,即使不是最令人愉快的。对于简单的 UI,我会再次尝试 GUI Builder,对于具有大量有线逻辑的复杂 UI,我可能仍然会手动编写。

    要了解 GUI Builder 的工作原理,请观看众多教程视频之一,例如这个:

    (2) Netbeans Platform 之于 Netbeans,RCP 之于 Eclipse。为 IDE 开发的一组丰富的组件,可以重用。我简要研究了NB Platform,如果项目没有改变方向,我们会使用它。也许这个 SO 问题可以更清楚地说明这方面:Which Rich Client Platform to use?


    关于 MVC。有 JSR 296,一个通用的 Swing 应用程序框架,看起来很有希望,但它是 withdrawn in 2011。这并没有阻止人们对它进行 fork 和工作,正如这个项目所示:Better Swing Application Framework,于 2012 年年中发布。即使你不使用这样的框架,请不要将所有代码放在一个class (正如您在评论中提到的那样),但创建一个简单的模型/控制器并保持 UI 组件分开。一个简单的应用程序不需要花哨,一个最小的 MVC-ish separation of concerns 可能就足够了。

    【讨论】:

    • 感谢您的信息。我对 NetBeans 相当熟练,所以实际上构建 GUI 不是问题。我主要想知道您是否可以将代码抽象为模型、视图和控制器,而不是仅将所有业务逻辑和视图信息存储在一起的一个类。我可能不得不手动编写代码,这不应该是一个大问题。
    【解决方案3】:

    我也遇到了这个问题,我找到了一个链接,它提供了一个很好的例子,如何使用 NetBeans GUI 构建器将控制器与视图分离。

    这里是link

    【讨论】:

      猜你喜欢
      • 2011-05-29
      • 1970-01-01
      • 2014-03-17
      • 2012-07-26
      • 2017-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多