2010-09-13 50 views
9

我是新手,但设法创造了一个下降gui。
虽然我的问题是我无法应用参考文献/教程中提出的模式,主要是MVC模式。java swing vs mvc:这种模式的确有可能吗?

是我,还是在JTree和使用SwingWorker,它是不可能有一个清晰的控制器/视图/模型分离?
例如,我使用Swingworker,但后来我无法在设计中“装配”控制器。

I.e.该控件的动作基本上在内部的doBackground方法中,例如按钮的动作执行。
所以没有控制器类。

swing工作者的行为结果是更新一个Jtree,所以我将结果传递给一个名为model的类,但是这个类必须能够访问JFrame内部的Jtree的treeModel,即观点,所以没有明确的观点和模式分离。

我看了很多教程,但所有介绍MVC都有一个简单的例子,在大多数情况下,视图(只是一些标签!)更新了所有内容。我是否完全困惑,或者在使用swingworkers和jtrees的swing应用程序中整合MVC模式并不容易或至少容易?

我说的是实际的域数据,而不是在swing组件中实现的MVC。

有人可以帮助我(让我从这个可怕的头痛中得到帮助)或者概述了如何接近这个设计,或者至少带有一个教程,这对于一个非平凡的例子来说很有用吗?

感谢

回答

6

当我有构建大型应用程序(人多年的发展),我们通常是抽象的MVC架构在单个组件之上到顶层控制器/模型和视图,并且接受单个组件将是他们自己的个性化MVC。 GeoffreyZheng在他的评估中绝对正确,这是我真正喜欢用Swing环境开发的东西。这就是说,如果你想要真正的MVC,你可能需要从单个组件中抽象出来,并用更抽象的术语来讨论视图。

+0

我明白你在说什么。但是如果我创建一个控制器,在JTree的情况下创建一个模型,我将不得不保留一个行为产生的结果放在树中的位置的信息。控制器可以将动作的结果传递给我的自定义模型,并且模型可以将事件触发到更新可用的视图。但树怎么知道在哪里放置新节点(或更新现有节点)?我不想重绘整个JTree。只有必须改变的部分。但这意味着模型必须知道JTree结构。所以这不是一个干净的分离。对? – Cratylus 2010-09-13 19:27:57

+1

当我使用JTree来表示某些东西时,我通常也将该信息作为树存储在后端。这意味着我可以传递几条信息 - 位置,深度等。或者,我可以使用后端的TreeModel作为模型的一部分,并让它自行触发事件。只要视图不是直接修改模型,我不会在那里看到一个巨大的问题。希望有助于澄清。 – aperkins 2010-09-13 19:50:02

+0

@perkins:对不起,我在最后一部分失去了你。您在模型中存储例如JTree的DefaultMutableTreeModel,并使用模型中的方法(add,insertNodeInto等)更新它?在第一部分中,您使用什么结构将信息作为树存储在后端? – Cratylus 2010-09-13 20:00:54

5

Swing是不是stricly MVC,如以前称为Sun openly admits it公司:

(传统的MVC分离)在实用性方面没有 工作做好,因为 视图和一个 组件的控制器部分需要一个紧密耦合 (例如,很难 编写一个通用控制器,没有 知道关于视图的具体情况)。因此,我们 将这两个实体折叠为一个 单个UI(用户界面)对象。

对于JTree,您可以使用TreeModel作为猜测它的模型。一些简单的组件如JLabel甚至没有模型。

正如链接的进一步解释,你确实得到了由LAF提供的UI类的一定程度的分离。然而,Swing组件本身必须维护和控制很多与UI相关的属性。

1

不确定这是否有帮助,但请尝试Swing应用程序框架(SAF)(JSR 296)。就我阅读或尝试这一点而言,它有助于将视图与事件处理分开。但我不这么用更复杂的例子的细节(如使用的JTree)

http://java.sun.com/developer/technicalArticles/javase/swingappfr/

祝你好运!

+3

不,我不认为SAF会帮助这个特定的话题;它不会强制你进入任何GUI模式,例如MVC,MVP ...在某些情况下,它甚至会鼓励意大利面编程...此外,SAF已经死了一两年了... – jfpoilpret 2010-09-14 01:19:05

4

在许多情况下,它仍然是可取的,也是可能的:当然,控制器需要了解组件,负责该操作,但该视图仍然不需要任何特定的操作实现。你只是不在视图类中实现这个动作,而是使用一个控制器(它知道视图和模型)。因此,在那里添加动作侦听器,例如更新一些模型细节,即使在SwingWorker中也是如此。

几乎在我看到的每个例子中,直到知道它是这样实现的,我没有看到它与其他任何组件的位置不同,比如jtree。也许与具有看看MVC和MVP(我喜欢)之间的差异

它更易于理解:MVC or MVP

+0

+1对MVP参考,我总是忘记提及。 :) – aperkins 2010-09-14 14:38:31