2

我有一个关于 MVC Swing java 应用程序的问题。

可以说,Entity e是一个没有任何逻辑的简单类——只有属性和 getter、setter、equals、hashCode、toString(或者可能是 compareTo)。它将代表 MVC 中的模型。

比我们拥有的MainWindow(作为 MVC 中的视图)。

可以使用e.getSomething();e.setSomething(someValue);甚至排序/迭代一些Elements集合MainWindow吗?因此,在组件侦听器匿名类中进行一些 GUI 渲染和操作(我猜侦听器实现不能在 Controller 中,因为它是“依赖于视图” - HTML 没有侦听器)?

我做了这样的事情MainWindow

...
final Element el = Controller.getInstance().getSomeElement();
JButton save = new JButton();
JTextField field = new JTextField(el.getSomething());

save.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        el.setSomething(field.getText());
        Controller.getInstance().persist(); //let controller know some Element has changed and needs to be saved
    }
});
...

如何更改这段代码以使其符合 MVC?谢谢。

4

1 回答 1

4

没有硬性规定;通常视图和控制器在 Swing 应用程序中组合在一起。

但是,在严格的 MVC 中,视图不应依赖于控制器。视图只是监听模型并绘制自己,然后将其组件和事件暴露给控制器。控制器对这些事件做出反应并根据需要更改模型,从而更改视图。

因此,在您的示例中,我将对 MainWindow 使用以下方法:

public void addSaveListener(ActionListener l) {
    save.addActionListener(l);
}

public void removeSaveListener(ActionListener l) {
    save.removeActionListener(l);
}

此外,我会将 Element 的实例传递给 MainWindow 构造函数,这样它就不必从 Controller 中获取它。控制器将创建 MainWindow,并传入它自己的引用。

然后,在控制器中:

myMainWindow.addSaveListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        el.setSomething(field.getText());
        persist(); // Element has changed and needs to be saved
    }
});

在较大的应用程序中,我会考虑事件总线架构而不是我上面写的,但这可能是一个不同的问题。

于 2013-02-15T04:26:40.940 回答