1

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

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

4

3 回答 3

4

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 变得复杂,你可以把这些东西排除在外,但它对于合理数量的屏幕等来说效果很好。

于 2013-01-08T17:23:36.423 回答
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 平台,如果项目没有改变方向,我们会使用它。也许这个 SO 问题可以更清楚地说明这一点:使用哪个富客户端平台?.


关于MVC。有 JSR 296,一个通用的 Swing 应用程序框架,看起来很有希望,但在 2011 年被撤回。这并没有阻止人们对它进行分叉并对其进行工作,正如这个项目所示:更好的 Swing 应用程序框架,于 2012 年年中发布。即使你不使用这样的框架,也请不要将所有代码放在一个类中(正如您在评论中提到的那样),但创建一个简单的模型/控制器并将 UI 组件分开。对于一个简单的应用程序来说,它不需要花哨,最小的 MVC-ish关注点分离可能就足够了。

于 2013-01-08T16:47:38.690 回答
0

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

这是链接

于 2013-04-09T21:36:28.807 回答