gpt4 book ai didi

java - 基于 MVC 的 GUI 中模型之间的通信

转载 作者:行者123 更新时间:2023-12-01 23:51:09 25 4
gpt4 key购买 nike

我正在根据 MVC 模式开发 GUI:

-GUIview:Swing 组件(JFrame 和几个 JTable)。-GUIcontroller:监听器(在此处添加,并在内部类中定义)-GUImodel:修改和存储数据,触发更改事件。

模型中的更改通过 Controller (而不是直接)传递到 View ,如 this 中所示示例。

我还为 View 类中包含的不同 JTable 编写了不同的自定义 JTableModel(扩展 AbstractTableModel)。所有 JTableModel 都在“GUImodel”包内的不同类中定义。每个 JTableModel 都定义了一个 ArrayList 和一些操作 ArrayList 的方法。

根据 MVC 指南,模型应该对 View 一无所知。事实上,main()方法的定义如下:

GUImodel model = new GUImodel();
GUIcontroller controller = new GUIcontroller();
GUIview view = new GUIview(controller, model);

controller.addView(view);
controller.addModel(model);

view.setVisible(true);
controller.addControllerListerners();

我的问题是:当我在 GUI 模型中执行方法时(例如,因为按下了 JButton 并且我需要从外部文件加载数据),我需要修改一些 JTableModel(将数据/行添加到其 ArrayList)并获取更改反射(reflect)在JTable中。我的第一个想法是:

ArrayList newArrayList = fileLoader(filePath);  //create ArrayList and load info
guiView.getTable1Model().updateArrayList(newArrayList); //update JTableModel ArrayList

但是,这种方法无效,因为 GUImodel 应该完全独立于 GUIview。

有什么想法吗?

最佳答案

最好认识到 MVC 主要是一种与数据封装有关的模式,它使用另一种模式“观察者”来传达更改。作为数据封装器,模型对 View 和 Controller 一无所知,但作为可观察对象,它确实知道它有观察者,当发生变化时需要通知观察者。

A Description of the Model-View-Controller User Interface Paradigm in the Smalltalk-80 System, page 4解释得很好:

To manage change notification, the notion of objects as dependents was developed. Views and controllers of a model are registered in a list as dependents of the model, to be informed whenever some aspect of the model is changed. When a model has changed, a message is broadcast to notify all of its dependents about the change. This message can be parameterized (with arguments), so that there can be many types of model change messages. Each view or controller responds to the appropriate model changes in the appropriate manner.

为了说明这个概念,您可以从自己的 Observer/Observable 类开始:

public interface Observer {
public void update(int message);
}
public interface Observable {
public void registerObserver(Observer observer);
}

public class Model implements Observable {
List<Observer> observers;

public void registerObserver(Observer observer) {
observers.add(observer);
}

public void loadFile(String path) {
// load file and change data
foreach (Observer observer: observers)
observer.update(READ_NEW_DATA);
}

public ArrayList getData() { return data; }
}

public class View implements Observer {
public void update(int message) {
doWhateverWith(model.getData());
}
}

public class Controller implements Observer {
public void update(int message) {
doWhateverWith(model.getData());
}

public void onClick() {
model.loadFile("someFile");
}
}

正如您所看到的,模型对 View 和 Controller 的内部工作一无所知。它甚至不知道返回 ArrayList 是否对它们特别有用(尽管实际上您希望情况如此)。所以从这方面来说,实现了独立性。

Obervable 和观察者之间的通信没有独立性,但这不是 MVC 模式要求的一部分。

如果您希望 GUI 搭在现有 Swing 观察者模式(监听器)之上,那么您的类应该从适当的类继承:

public class Model extends AbstractTableModel...

public class View implements TableModelListener...

public class Controller implements CellEditorListener...

等等。由于JTable同时实现了TableModelListener和CellEditorListener,因此它实际上是View和Controller的组合。因此,您可以选择使用组合的 ViewController 类来扩展 JTable,或者单独使用它们。在后一种情况下,View 可以扩展 JTable,覆盖控件监听器,以便它们将事件传递给 Controller 类。但这听起来似乎工作量大于其值(value)。

关于java - 基于 MVC 的 GUI 中模型之间的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17022406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com