java - 使用 NetBeans GUI 构建器以 Java MVC 方法进行编程

标签 java swing model-view-controller netbeans

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

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

最佳答案

Netbeans 可以很好地执行此操作。

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

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

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

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

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

现在,下一个问题是如何将 JTable 关联到您的 List 模型。

第一,您可以子类化 JTable 并将其绑定(bind)到您的模型。或者,更简单地说,您将 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});
        }
    }
}

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

这是一个非常简单的 GUI,但它显示了所有这些如何连接在一起的基础知识。我认为这在 Swing 示例中丢失了一点,这些示例非常适合单面板屏幕,但当您开始添加其他 View 时根本无法缩放。

您的 JPanels 基本上变成了组合 VC,因为您的 GUI 变得越来越复杂,您可以将这些事情排除在外,但它对于合理数量的屏幕等来说效果很好。

关于java - 使用 NetBeans GUI 构建器以 Java MVC 方法进行编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14219737/

相关文章:

java - 如何为 Java 11 编译和运行我的 Maven 单元测试,同时为旧版本的 Java 8 编译我的代码

asp.net-mvc - 如何在 Controller 中显示警报消息

c# - MVC中应该在哪里进行计算?

java - 如何将圆圈放在线的中心?

java - weblogic java.lang.IllegalStateException : Could not find backup for factory javax. faces.context.FacesContextFactory。

Java:一旦我清空 ArrayList 从中获取其内容的文本文件,我的 ArrayList 就会自行清空

java - 从 JTable 解析的 double 总和

java - 使用 JTextField 从用户获取正则表达式。如何让它显示为选项卡而不是后跟 t

java - 如何读取文件,将数据放入JTable中,然后修改单元格/删除行并将数据保存到文件中?

ios - CS193P 作业 3,提示#5 - 模型是什么?