在 Java 中根据 Model-View-Controller 制作视图

Making views according to Model-View-Controller in Java

我有一个包含部门名称列表的应用程序 - 当用户单击其中一个时,应该会出现一个显示其详细信息的 JPanel。我在专门 class 的模型中加载了一个 Department 对象,但是将整个对象传递到自定义 DepartmentDetailsPanel 构造函数并提取数据以从中显示(例如姓名、用户列表等)是一种不好的做法吗? ..)?

public class DepartmentDetailsPanel extends JPanel {

    private ClassLoader cl = this.getClass().getClassLoader();
    private JPanel iconAndName = new JPanel();
    private JLabel icon;
    private JLabel name;

    private JPanel body = new JPanel();

    private JPanel basicInfo = new JPanel();
    private JLabel headLabel = new JLabel(Constants.head_name_lable);
    private JLabel managerLabel = new JLabel(Constants.manager_name_label);
    private JLabel typeLabel = new JLabel(Constants.type_label);

    private JLabel head;
    private JLabel manager;
    private JLabel type;

    private JPanel membersPanel = new JPanel();
    private JLabel usersLabel = new JLabel(Constants.members_label);
    private JList members;
    private JPanel memberButtons = new JPanel();
    private JButton removeButton = new JButton(Constants.remove);
    private JButton addButton = new JButton(Constants.add);

    public DepartmentDetailsPanel(Department d) {
        setLayout(new BorderLayout());
        setBorder(new EmptyBorder(10, 10, 10, 10) );

        iconAndName.setLayout(new FlowLayout(FlowLayout.LEFT));
        int dType = d.getType();
        if (dType == 1)
            icon = new JLabel(new ImageIcon(cl.getResource("leader.png")));
        if (dType == 2)
            icon = new JLabel(new ImageIcon(cl.getResource("creative.png")));
        if (dType == 3) 
            icon = new JLabel(new ImageIcon(cl.getResource("finance.png")));

        name = new JLabel(d.getName());
        iconAndName.add(icon);
        iconAndName.add(name);
        add(iconAndName, BorderLayout.NORTH);

        basicInfo.setLayout(new GridLayout(3, 2));
        basicInfo.add(typeLabel);
        type = new JLabel(Constants.department_types[dType-1]);
        basicInfo.add(type);
        basicInfo.add(headLabel);
        head = new JLabel(d.getHeadName());
        basicInfo.add(head);
        basicInfo.add(managerLabel);
        manager = new JLabel(d.getManagerName());
        basicInfo.add(manager);
        body.setLayout(new BoxLayout(body, BoxLayout.Y_AXIS));
        body.add(basicInfo);

        membersPanel.setLayout(new BorderLayout());
        membersPanel.add(usersLabel, BorderLayout.NORTH);
        JComponent memberList = makeList(extractMembers(d), members);
        membersPanel.add(memberList, BorderLayout.CENTER);
        memberButtons.setLayout(new BoxLayout(memberButtons, BoxLayout.Y_AXIS));
        memberButtons.add(addButton);
        memberButtons.add(removeButton);
        membersPanel.add(memberButtons, BorderLayout.EAST);
        body.add(membersPanel);
        add(body, BorderLayout.CENTER);
    }

    private JComponent makeList(String[] data, JList list) {
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(1, 1));
        panel.setBackground(Constants.lightGrey);
        if (data == null){
            JLabel message = new JLabel(Constants.nothing_to_view);
            panel.add(message);
        } else {
            list = new JList(data);
            list.setVisibleRowCount(10);
            list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            list.setLayoutOrientation(JList.VERTICAL); 
            list.setBackground(Constants.lightGrey);
            panel.add(new JScrollPane(list));
        }
        return panel;
    }

    private String[] extractMembers(Department d){
        String[] members = null;
        List<User> list = d.getMembers();
        if (list != null || list.size()==0){
            members = new String[list.size()];
            int i = 0;
            for (User u: list){
                members[i] = u.getName() +" "+ u.getLastname();
                i++;
            }
        }
        return members;
    }

}

只要你除了获取字段值什么都不做就可以了。视图 必须 使用模型,否则如何显示模型?

你要注意对象和数据结构的区别。 数据结构是 class 的一个实例,它只有 getter 和 setter。对象更智能,因为它们进行一些计算或一些处理。在这里找到更多 http://blog.8thlight.com/uncle-bob/2013/10/01/Dance-You-Imps.html

MVC 已成为迄今为止最令人困惑的模式之一,因为它不再符合最初创建时的目的。

MVC 模式中的视图层基本上有两个作用:表示数据和接收用户操作。数据表示意味着以某种方式保持视图状态和模型状态。例如,即使我不喜欢这种方法,您也可以通过将模型数据传递给视图来做到这一点。但是您可以使用其他机制。例如,您可以使用绑定技术来更新视图和模型上的数据状态。但最重要的事情是在你的所有应用程序中保持一种方法来进行数据表示,尤其是当你与团队合作时。 您可以在此处阅读有关 GUI 架构的更多信息: http://martinfowler.com/eaaDev/uiArchs.html