JavaSwing与mvc:这种模式真的可能吗?

JavaSwing与mvc:这种模式真的可能吗?,java,model-view-controller,design-patterns,swing,jtree,Java,Model View Controller,Design Patterns,Swing,Jtree,我是swing新手,但成功创建了一个图形用户界面。 但我的问题是,我无法应用参考/教程中建议的模式,主要是MVC模式 是我,还是在JTree中使用SwingWorker,不可能将控制器/视图/模型明确分开? 例如,我使用一个Swingworker,但是我不能在设计中“安装”控制器 也就是说,控件的动作本质上是在按钮动作执行内部的doBackground方法中。 所以没有控制器类 swing worker中的操作的结果是更新一个Jtree,因此我将结果传递给一个名为model的类,但该类必须能够访

我是swing新手,但成功创建了一个图形用户界面。
但我的问题是,我无法应用参考/教程中建议的模式,主要是MVC模式

是我,还是在JTree中使用SwingWorker,不可能将控制器/视图/模型明确分开?
例如,我使用一个Swingworker,但是我不能在设计中“安装”控制器

也就是说,控件的动作本质上是在按钮动作执行内部的doBackground方法中。
所以没有控制器类

swing worker中的操作的结果是更新一个Jtree,因此我将结果传递给一个名为model的类,但该类必须能够访问JFrame中Jtree的treeModel,即视图,因此视图和模型之间没有明确的分离

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

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

有人能帮我(让我免于这个可怕的头痛)概述一下这个设计是如何实现的,或者至少有一个有用的教程,有一个不平凡的例子吗


谢谢

Swing并不像以前被称为Sun的公司那样是严格意义上的MVC:

(传统的MVC分离)没有 在实践方面做得很好,因为 视图的视图和控制器部分 组件需要一个紧密的联轴器 (例如,很难 编写一个通用控制器,该控制器没有 了解视图的详细信息)。所以我们 将这两个实体折叠为一个 单个UI(用户界面)对象

对于JTree,您可以将TreeModel作为模型。一些简单的组件,比如JLabel,甚至没有模型


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

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


祝你好运

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

在我看到的几乎每一个例子中,直到我知道它是这样实现的,我看不出它与任何其他组件(如jtree)有什么不同


也许看看MVC和MVP(我更喜欢)之间的区别就更容易理解了:

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

我理解您的意思。但是如果我创建了一个控制器model,在JTree的情况下,我必须保留关于操作产生的结果应该放在树中的位置的信息。控制器可以将一个操作的结果传递给我的自定义模型,模型可以向视图触发一个更新可用的事件。但树如何知道新节点(或更新现有节点)的位置?我不想重新粉刷整棵树。只有必须更改的部分。但这意味着模型必须了解JTree结构。所以这不是一个干净的分离。对吗?当我使用JTree来表示某个东西时,我通常也将信息存储在后端的树中。这意味着我可以传递一些信息——位置、深度等。或者,我可以使用后端的TreeModel作为模型的一部分,让它触发事件本身。只要视图没有直接修改模型,我就看不出有什么大问题。希望这有助于澄清。@perkins:对不起,我在最后一部分失去了你。您是否将JTree的DefaultMutableTreeModel存储在模型中,并使用其方法(add、insertNodeInto等)从模型中进行更新?在第一部分中,您使用什么结构将信息作为树存储在后端?如果我不清楚,很抱歉-我的意思是您可以将树作为树模型(不可变)放入JTree中,但在模型本身中它是可变的(相同的数据结构)。当应用程序模型中的树模型本身发生更改时,您将让它向其拥有的任何树模型侦听器发送通知,以便它们更新视图。通过这种方式,视图不会直接修改模型中的值,但仍然会以一种相当简洁的方式得到通知。很高兴进一步解释一下——您可以使用默认树模型或自定义实现——这对于讨论来说并不重要。我想说的是(有些不成功)JTree本身不应该更改树模型中的数据,而是应该触发推送到应用程序(或域)模型中的事件。然后处理这些事件,eventu