将视图拆分为Swing MVC中的多个文件

时间:2013-05-17 13:50:32

标签: java swing design-patterns model-view-controller

我的项目遵循MVC模式。为了快速,我将只发布与我的问题相关的代码(不涉及模型)。解释如下。

Controller.java

public class Controller {

    public View myView;

    public Controller() {
        myView = new myJFrame(this);
    }

    public void displayViews() {
        myView.display();
    }

    public void closeViews() {
        myView.close();
    }
}

View.java

public abstract class View {

    private Controller controller;

    public View(Controller controller) {
        super();

        this.controller = controller;
    }

    public final Controller getController() {
        return controller;
    }

    public abstract void display();

    public abstract void close();
}

myJFrame.java

public class myJFrame extends View {

    private JFrame frame;
    private JMenuBar myMenuBar;

    public myJFrame(Controller controller) {
        super(controller);
        buildFrame();
    }

    private void buildFrame() {

        frame = new JFrame();
        menuBar = new JMenuBar();
        ...
    }

    @Override
    public void close() {
        frame.dispose();
    }

    @Override
    public void display() {
        frame.setVisible(true);
    }
}

此代码完美无缺。但是,如果我不断添加组件,buildFrame()方法将很快变为巨大,因此我想将其拆分并在每个Swing组件的新文件中创建一个新类。

问题是我希望我的组件保留对Controller的访问权限。 myFrame扩展View,因此可以随时调用getController()方法。但是当我创建一个单独的文件时不再是这种情况。扩展View似乎不是一种选择(此外,myMenuBar已经扩展JMenuBar,例如)。

你会建议什么?

1 个答案:

答案 0 :(得分:3)

  

问题在于我希望我的组件保留对Controller的访问权限。

精细。为构成GUI的JPanel创建一个类,并通过各自的构造函数将View实例传递给它们。

除非重写组件方法,否则不应扩展Swing组件。你应该使用Swing组件。

构图而不是继承

您也不应该扩展View。传递视图的实例就足够了。

阅读这篇优秀的文章Sudoku Solver Swing GUI,以便更好地了解在构建Swing GUI时如何使用MVC模式。