Java 如何';s视图将知道要创建什么组件?

Java 如何';s视图将知道要创建什么组件?,java,model-view-controller,components,Java,Model View Controller,Components,我正在开发这个应用程序,你可以把文本和图纸放在一个页面上。我的应用程序是MVC模式的,我需要所有的模型部分、文本和形状具有相同的概念。例如,它们都扩展了抽象ReportElement clas 但问题是我为页面中的每个形状都装了一个JPanel,但要处理文本,我需要使用JTextArea或其他什么。为了呈现元素,视图直接从模型中获取报告元素列表并逐个绘制。如何在不影响MVC模式的情况下区分文本元素 我是说,这是不可能的,对吧?我不知道,有什么想法吗?我会通过构建一个工厂方法来处理这种情况,该方法

我正在开发这个应用程序,你可以把文本和图纸放在一个页面上。我的应用程序是MVC模式的,我需要所有的模型部分、文本和形状具有相同的概念。例如,它们都扩展了抽象ReportElement clas

但问题是我为页面中的每个形状都装了一个JPanel,但要处理文本,我需要使用JTextArea或其他什么。为了呈现元素,视图直接从模型中获取报告元素列表并逐个绘制。如何在不影响MVC模式的情况下区分文本元素


我是说,这是不可能的,对吧?我不知道,有什么想法吗?

我会通过构建一个工厂方法来处理这种情况,该方法为任何给定的
ReportElement
生成正确类型的Swing组件,如下所示:

public static JComponent buildViewForReportElement(ReportElement element)
在该方法中,您需要实际检查
ReportElement
对象,以查看要构建的组件类型。这种检查可能意味着检查每个对象上的字段或标志,甚至可能意味着使用
instanceof
来区分
ReportElement
的不同子类

请注意,这样检查
ReportElement
对象违反了面向对象编程的理念。一个简单的“面向对象”解决方案需要所有
ReportElement
对象都有
buildView()
getView()
方法,因此您的GUI代码只需在每个
ReportElement
上调用
getView()
,而不知道
getView()的哪个实现
实际上正在被调用


不幸的是,面向对象的解决方案迫使您将视图代码与模型代码混合在一起,最好将两者分开。这就是为什么我主张将GUI构建代码排除在
ReportElement
对象之外,而是使用工厂方法为任何给定的
ReportElement
构建正确的视图。我认为您正在寻找


您需要有一个包装器方法,根据您自己的
ReportElement
条件返回
JComponent

非常感谢。现在,这难道不是让视图“了解”了模型,违反了它们之间的分离吗?或者工厂的东西隐藏了它还是什么?工厂本身不是视图的一部分,也不是模型的一部分。工厂必须同时了解模型和视图,但它不是它们的一部分。同样感谢链接,伙计,你对我下面的问题怎么看?这种模式并没有破坏MVC。事实上,您的工厂方法应该位于一个辅助工厂类中,该类处理所有这些逻辑。这样,您的视图仍然只知道布局、数据模型和控制器。。。。嗯,控制;)您可以直接从视图中调用Factory方法,因为它的行为与任何其他JComponent creator.hmm类似。根据你的评论,如果我说这个工厂是控制器机制的一部分,它的类应该在控制器包中,我会错吗?等等,不,它是一个视图机制,因为它将为视图提供jcomponents,视图将,嗯,将它们添加到面板中。。我想。不,等等,如果是景观,那也没什么不同。它应该在模型中。但是,这个模型正在创建JComponents,这不是很糟糕吗?