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