0

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

控制器.java

public class Controller {

    public View myView;

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

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

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

查看.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 组件创建一个新类。

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

你有什么建议?

4

1 回答 1

3

问题是我希望我的组件保留对控制器的访问权限。

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

除非您覆盖组件方法,否则不应扩展 Swing 组件。您应该使用 Swing 组件。

组合优于继承

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

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

于 2013-05-17T14:16:38.330 回答