Java 正确使用MVC模式在Swing中使用数据填充Jlist

Java 正确使用MVC模式在Swing中使用数据填充Jlist,java,swing,model-view-controller,Java,Swing,Model View Controller,我正在写一个MVC应用程序。我有一个JList,我确实需要填充在模型/控制器上烘焙的数据 我不知道如何在不破坏MVC模型的情况下将数据传递给视图;这是在视图上存储/创建数据 这是我的代码的精简版 // This class receives data and works on it. Is not related to show // what it does for the purposes of my question. Just know that the // data that I

我正在写一个MVC应用程序。我有一个JList,我确实需要填充在模型/控制器上烘焙的数据

我不知道如何在不破坏MVC模型的情况下将数据传递给视图;这是在视图上存储/创建数据

这是我的代码的精简版

// This class receives data and works on it. Is not related to show 
// what it does for the purposes of my question. Just know that the 
// data that I want to show on the JList on the view should be created 
// here.
// 
// public class controller implements Observer{
// }
以下是视图:

// Imports

    public class View extends JPanel {


        public View() {
            super();

            JList itemList = new JList();
            DefaultListModel listModel = new DefaultListModel();

            itemList.setModel(listModel);

            listModel.addElement("Element1");
            listModel.addElement("Element2");
            listModel.addElement("Element3");
            listModel.addElement("Element4");
            listModel.addElement("Element5");
            listModel.addElement("Element6");

            itemList.setFont(new Font("Arial",Font.BOLD,40));

            this.setLayout(new GridLayout());
            JButton button = new JButton("New Time");
            JButton button1 = new JButton("New Time2");
            label.setFont(new Font("Serif", Font.PLAIN, 50));

            JPanel group = new JPanel( new GridLayout())
                    ;
            group.add(button);
            group.add(button1);

            JPanel east = new JPanel( new BorderLayout() );

            east.add(label, BorderLayout.NORTH);
            east.add(itemList, BorderLayout.CENTER);
            east.add(group, BorderLayout.SOUTH);

            add(east, BorderLayout.EAST);

        }

    }
因此,在视图的JList中,我需要显示项目,但我不知道如何从控制器/模型上创建的数据填充JList。我只知道如何像我在视图上那样添加元素,这是错误的

我不知道是否可以告诉Jlist使用在控制器/模型上创建的数据

欢迎任何帮助

谢谢

我不知道如何在不破坏MVC模型的情况下将数据传递给视图;这是在视图上存储/创建数据

您可以将“控制器”设置为一个
ListModel
,然后将其作为另一个
ListModel
或通过原始模型提供的信息代理来自基础模型的数据

在我看来,这太过分了,浪费了你很多时间

Swing已经实现了MVC,更像是MV-C,试图在其上包装另一个(纯)MVC总是会出现问题

相反,模型应该提供一些数据,作为数组或
列表
,这些数据可以通过视图显示,以视图认为最好的方式显示

在这种情况下,视图不是“创建数据”,因为数据是由控制器通过模型提供的

无论您做什么,您都会发现视图必须在某个级别上维护对数据的引用,例如,
JTextField
将以
字符串的形式存储数据-必须这样做,否则它无法工作

这只是我的观点,但我以前曾与这些问题作过斗争。关注数据的需求,关注您如何与模型、控制器和视图进行通信,从而使每一层彼此分离(即,不要向控制器公开UI元素,它不关心“如何”管理它,只关心视图承诺提供一些信息)


通过这种方式,您可以更改模型、视图和/或控制器的实现,其他人都不必关心,它应该继续工作

请不要忘记,Swing本身就是一种MVC(例如,
JList
有一个模型的概念,它也内置了一个控制器),因此有时候,实现一个纯MVC可能很困难。一个纯MVC,会让控制器充当一个“数据源”,将信息从模型传送到视图,但在这种情况下,会有大量代码重复,这是不需要的。根据您的需要,您可以让模型提供一个“数据列表”方法,控制器将该方法传递给视图,然后视图将其包装在一个
ListModel
中,以满足自己的需要。这意味着模型或控制器都不关心数据是如何呈现的,只关心数据是以某种形式呈现的(可以是组合框或表格…谁在乎呢:P)您的JList及其模型是在视图的构造函数中声明的局部变量,这意味着无法在程序运行时更改其状态,因此编写的代码将无法工作。在需要时使用私有字段,并为视图提供适当的方法,以允许控制器在需要时更改其状态。我猜,he需要使用完整的MVC,不管是否出于分配目的,但我可能错了。我理解你的观点,这没关系。我需要在视图上有一个JList。然后,当一个新对象添加到模型的列表中时,我需要-自动-刷新它。我如何在控制器上做到这一点?我不知道,真的。这开始变得越来越重要总而言之,a请设计我的mcv类型问号。我只是不知道如何将视图与模型进行通信。我是绝对诚实的,你错了。@CapitanGrantX你需要一个观察者模式。你的模型生成某种更新事件,你的控制器向其注册并传递到视图中。看看ListModel,它有监听器支持,你需要同样的东西