当前位置: 首页 > 知识库问答 >
问题:

JAVA Swing MVC-主控制器?

夹谷斌蔚
2023-03-14

我在设计我要开发的应用程序的架构时遇到了一些问题。我正在研究JAVA,我开始研究这个应用程序,因为我想加深我对JAVA、体系结构和模式的全面了解。我想按照这些指导原则来创建一个可重用、低耦合的应用程序,就像它应该做的那样。应用程序只有一个JFrame,但其中有几个JPanel,每个代表应用程序的一个模块。

问题是:在JAVA Swing中,如何实现一个合适的MVC模式?我在如何理解应该如何做的问题上挣扎。

我应该有一个主控制器类,它保存对所有其他控制器的引用吗?(我这里有一张图片来展示这一点:https://docs.google.com/file/d/0B7tBdn5slIFeY2FoSmxESTREQ1k/edit?usp=sharing)

在这种情况下,所有需要更改正在呈现的模块的事件都应该重定向到主控制器吗?

或者我应该将JFrame与应用程序的控制器耦合,并直接与它们通信吗?

基本上,我想知道我是否需要一个“管理”所有其他类的类。我已经读过一些解释和不同的观点,但我认为这是更具体的一点。

希望我已经说清楚了(也希望我的解释比我的画好:)。

编辑:应用程序用法示例:

  • 在应用程序的整个生命周期中,只有一个JFrame
  • 菜单将位于左侧,如BorderLayout。西部
  • 应用程序的当前模块将位于中心,如BorderLayout。中心
  • 用户按下菜单的一个按钮时,相应的模块被加载到BorderLayout中。中心

菜单(视图)应该有自己的控制器吗?这个控制器应该与JFrame通信吗?JFrame会将新模块加载到它的布局中吗?或者JFrice应该有自己的控制器(或模型,如Gilbert Le Blanc所说)?

我知道这似乎很具体,或者很容易理解,但每次我想到一个桌面应用程序,我都很难理解这一点。

共有2个答案

公良玺
2023-03-14

正如本文所讨论的,Swing组件使用可分离的模型体系结构,模型和视图使用观察者模式松散耦合。并非每个GUI控制器都必须控制。使用ActionListener,例如Action,对于封装应用程序功能特别方便。

附录:我会使用卡片布局,如图所示切换面板。请注意操作处理程序如何与按钮、菜单、组合框、工具栏等一起使用。每张卡的内容可以有自己的MVC模式实现,与其他卡不同。使用PropertyChangeEvent(如图所示)在组件之间进行通信。

一般来说,Swing组件(例如按钮和表)已经监听它们各自的模型,让您专注于应用程序的数据模型及其监听视图。方便的是,Swing模型,例如ComboBoxModelTableModel',可以有多个侦听器。

杨甫
2023-03-14

当应用程序带有GUI时,GUI模型将成为应用程序视图。应用程序通过GUI模型与GUI交互。

或者我应该将JFrame与应用程序的控制器耦合,并直接与它们通信吗?

这就是我所做的。我已经将控制器类打包在一起,但我从未创建过一个主控制器类。

我将图形用户界面控制器类与任何其他应用程序控制器类(如数据访问对象)放在一个单独的包中。

我通常会把每个JPanel放在自己的类中,但我不认为这是一个要求。JFrame有自己的类,尽管JFrame的实例和GUI模型的实例被传递给几乎所有的GUI组件。这使得菜单操作成为可能。

这篇交通信号GUI文章介绍了如何编写一个非常简单的GUI的基础知识。

编辑以回应问题中的更改。

GUI控制器与GUI模型是分开的。GUI模型包含构成GUI的所有数据元素。JTextFields的字符串,JTables的DefaultTableModels。

根据您的应用程序设计,我建议您为希望放在应用程序中心的每个JPanel创建一个Java类。JANEL将根据您的菜单框显示。我还建议您看看JTabbedPane,它使用不同的用户界面来完成选择使用哪个面板的任务。

假设你使用左边的菜单,每个菜单选项(切换JButton?)将有自己的控制器方法或类。这些控制器必须有一个JFrame的实例,这样控制器就可以调用JFrame类中的方法,将适当的面板放在显示屏的中心。控制器决定调用哪个方法,但这些方法本身是JFrame类的一部分。

我一直在谈论JFrame和JPanel类。使用组合而不是继承来构建这些类是很重要的。JFrame类包含一个JFrame。它不扩展JFrame。扩展Swing组件的唯一时间是要重写组件方法的时间。

 类似资料:
  • 我在设计我要开发的应用程序的架构时遇到了一些问题。我正在研究JAVA,我开始研究这个应用程序,因为我想加深我对JAVA、体系结构和模式的全面了解。我想按照这些指导原则来创建一个可重用、低耦合的应用程序,就像它应该做的那样。应用程序只有一个JFrame,但其中有几个JPanel,每个代表应用程序的一个模块。 问题是:在JAVA Swing中,如何实现一个合适的MVC模式?我在如何理解应该如何做的问题

  • 这让我的头撞到了墙上!!!!希望有人能给我指出正确的方向。我确信我在做一些完全愚蠢的事情。我找了又找,但似乎找不出为什么这不管用!!(在IntelliJ IDE 15.x上使用JDK8.x和Scenebuilder)。我试图在GUI上显示数据,但希望access通过编程将这些数据从其他类/方法发送给它。。。。下面是一个简单的概念,我在着手更大的项目之前,正试图让它发挥作用: 我的简单GUI在FXM

  • 我有一个主控制器来处理我的主控制器。fxml和处理弹出窗口的第二个控制器。fxml 从主控制器按下按钮时,弹出窗口出现。在弹出窗口中添加玩家。玩家通过textfield添加到数组中,并且必须发送回主控制器。我在弹出控制器中有一个名为“Btnaply”的按钮,当按下该按钮时,我想关闭弹出窗口并从主控制器类处理数组。我只想让我的主控制器类知道弹出窗口。 这是我从主控制器创建弹出窗口的方式: 现在的问题

  • 我在本地机器上的vbox上托管的ubuntu服务器上安装了openshift源(单节点集群),我需要使用其来自我的主机(客户端)的IP通过Web访问它,但它总是将我的IP重定向到本地主机172.0.0.1,如何克服这个问题?

  • Lnmp虚拟主机控制面板简介 01)此虚拟主机控制面板是由易客CRM(http://www.c3crm.com)开发团队基于amh针对lnmp0.7一键安装包开发的面板,目前在Redhat和Centos下测试正常。 02) 简单: 简洁精致,支持ssh、web在线轻松管理维护虚拟主机、MySQL、FTP。 03) 高效: 使用高性能Nginx服务器软件支持,面板基于AMH命令行运行,实现过程快速高

  • 我需要在主控制器中绑定来自不同fxml的控件。我有3个fxml文件,分别名为MainView.fxml、ChildView1.fxml和ChildView2.fxml。 mainview.fxml ChildView1.fxml 默认情况下,从ChildView1Controller禁用button1。 我希望在我的另一个视图(ChildView2.fxml)中的表行被选中时启用它。同样,在取消选