带子窗口的MVC模式

时间:2018-05-17 13:26:27

标签: java swing

在Java中,我有一个带按钮的简单窗口。当我按下按钮时,我调用另一个类的构造函数,该类再次打开一个带有按钮的新窗口。 1)使用Observer Observable模式从Model类调用View类的方法是否正确? 2)将新窗口的调用委托给View类是否正确?或者我必须在Model类中执行此操作? 3)如何在Controller类中为新按钮设置监听器?目前我调用了Controller类的构造函数,我有一个View实例(带有第一个按钮),但我还没有子窗口类的实例(所以第二个按钮)。

查看:

import java.awt.*;
import java.util.Observable;
import java.util.Observer;
import javax.swing.*;

public class View implements Observer
{
    JFrame frame;
    JPanel panel;
    JButton button;

    Model model;

    public View(Model model)
    {
        frame = new JFrame();
        panel = new JPanel();
        button = new JButton("Press");
        this.model = model;

        panel.add(button);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500,500); 
        frame.add(panel);
        frame.setVisible(true);
    }

    public void update(Observable ob, Object extra_arg)
    {
        switch(model.method_var)
        {
            case 0:
                NewWindow newwindow = new NewWindow();
        }
    }
}

型号:

import java.util.Observable;

public class Model extends Observable
{
    int method_var;

    public void newwindow()
    {
        method_var = 0;
        setChanged();
        notifyObservers();
    }
}

控制器:

import java.awt.event.ActionEvent;

public class Controller 
{
    Model model;
    View view;

    public Controller(Model model, View view)
    {
        this.model = model;
        this.view = view;

        view.button.addActionListener(new Action());

        model.addObserver(view);
    }

    class Action implements java.awt.event.ActionListener 
    {        
        public void actionPerformed(ActionEvent e)
        {
            model.newwindow();
        }
    }

}

新视窗:

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class NewWindow 
{
    JFrame frame;
    JPanel panel;
    JButton button;

    Model model;

    public NewWindow()
    {
        frame = new JFrame();
        panel = new JPanel();
        button = new JButton("Press again");
        this.model = model;

        panel.add(button);
        frame.setSize(100,100); 
        frame.add(panel);
        frame.setVisible(true);
    }
}

主:

public class Main 
{
    public static void main(String[] args)
    {
        Model model = new Model();
        View view = new View(model);
        Controller controller = new Controller(model, view);
    }
}

1 个答案:

答案 0 :(得分:0)

恕我直言,所有逻辑应该在组件的控制器中。这是他们的目的。这样做需要更多的努力,但它也可以避免设计增长时的混乱。