Java 正确使用MVC模式在Swing中使用数据填充Jlist
我正在写一个MVC应用程序。我有一个JList,我确实需要填充在模型/控制器上烘焙的数据 我不知道如何在不破坏MVC模型的情况下将数据传递给视图;这是在视图上存储/创建数据 这是我的代码的精简版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
// 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,它有监听器支持,你需要同样的东西