【问题标题】:Java Swing MVC - best practice to implement ModelJava Swing MVC - 实现模型的最佳实践
【发布时间】:2018-02-25 11:33:10
【问题描述】:

我正在尝试找出创建/使用 MVC 模式模型的最佳方法。 我有一个列表 (database) Persons 和一个 View 代表某些 Person 的部分数据。

问题是: 如果我有一个大型数据库,其中每个人包含大量数据,并且我有一个视图面板,它只显示一个人的少量数据,我应该创建一个仅维护该视图的可呈现数据的模型,还是应该使用 @ 987654325@直接当Model?

我将有不同的视图来表示同一数据库的不同数据。 database 应该成为所有视图的模型还是我需要为每个视图面板创建小模型?

这是一个小示例,其中有 1 个视图面板,database 直接作为所有视图面板的模型:

Main.java

import java.awt.EventQueue;
import javax.swing.JFrame;

public class Main {
    private JFrame frame;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    new Main();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public Main() {
        initialize();
    }

    private void initialize() {

        Database.getInstance();                         // model ?
        View view = new View();                         // view
        Controller controller = new Controller();       // controller

        Database.getInstance().addObserver(view);
        view.addController(controller);

        frame = new JFrame();
        frame.add(view.createView());
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
}

Person.java

public class Person {

    private String name;
    private int age;
    private String sex;

    public Person(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getSex() {
        return sex;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

}

Database.java(模型)

import java.util.ArrayList;
import java.util.List;
import java.util.Observable;

public class Database extends Observable {

    private static Database instance = null;
    private List<Person> database = new ArrayList<Person>();

    private Database() {
        this.database = createDataBase();
    }

    public static Database getInstance() {
        if (instance != null)
            return instance;
        else
            return instance = new Database();
    }

    private List<Person> createDataBase() {
        List<Person> database = new ArrayList<Person>();
        database.add(new Person("A", 25, "male"));

        return database;
    }

    public List<Person> getDatabase() {
        return database;
    }

    public void changeData(String name, int age, String sex) {
        database.get(0).setName(name);
        database.get(0).setAge(age);
        database.get(0).setSex(sex);
        setChanged();
        notifyObservers();
    }

}

View.java

import java.awt.BorderLayout;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class View implements Observer {

    private JLabel nameLabel;
    private JLabel ageLabel;
    private JButton changeDataButton;

    public View() {
        this.nameLabel = new JLabel();
        this.ageLabel = new JLabel();
        this.changeDataButton = new JButton("Change Data");
    }

    public JPanel createView() {
        JPanel viewPanel = new JPanel(new BorderLayout());
        viewPanel.add(new JLabel("View only name and age"), BorderLayout.NORTH);
        viewPanel.add(nameLabel, BorderLayout.WEST);
        viewPanel.add(ageLabel, BorderLayout.EAST);
        viewPanel.add(changeDataButton, BorderLayout.SOUTH);

        inizializeView();

        return viewPanel;
    }

    private void inizializeView() {
        this.nameLabel.setText(Database.getInstance().getDatabase().get(0).getName());
        this.ageLabel.setText("" + Database.getInstance().getDatabase().get(0).getAge());
    }

    public void addController(Controller controller) {
        changeDataButton.addActionListener(controller);
    }

    @Override
    public void update(Observable obs, Object obj) {
        nameLabel.setText(((Database) obs).getDatabase().get(0).getName());
        ageLabel.setText("" + ((Database) obs).getDatabase().get(0).getAge());
    }

}

Controller.java

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Controller implements ActionListener {

    public Controller() {

    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
        Database.getInstance().changeData("B", 30, "female");       // change model
    }

}

如您所见,view 面板仅代表 Person 的 2/3 字段。我应该为此视图面板实现一个单独的模型,它只代表Person 中的String nameint age,还是应该保留所有内容?

【问题讨论】:

    标签: java swing model-view-controller model


    【解决方案1】:

    如您所见,视图面板仅代表 Person 的 2/3 字段。我应该为此视图面板实现一个单独的模型,它只表示 Person 的字符串名称和 int 年龄,还是应该保留所有内容?

    我建议您保持模型不变。这是 MVC 的好处之一,一个模型可以以多种不同的方式显示,这可能意味着只显示模型状态的一部分,就像你正在做的那样,或者使用完全不同的 GUI 库或平台显示它(例如,安卓)。此外,更重要的是,通过这种方式,对单个模型的更改会反映在共享相同模型的所有视图中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      • 2011-04-08
      • 1970-01-01
      相关资源
      最近更新 更多