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

在Java Swing中实现MVC的控制器部分

柴琨
2023-03-14

这个问题主要是关于在Java-Swing中实现MVC体系结构的标准实践。我知道以前有人问过这个问题,但我想更具体地介绍一下控制器的使用。

我一直在分离我的模型、视图和控制器,其中:

  • 数据在模型类内处理
  • Swing组件位于视图类中
  • 事件处理匿名类也在视图类(用户输入)中
  • 控制器类包含对模型和视图对象的引用

回到具体的控制器-我一直使用类(静态)变量来表示控制器,以方便应用程序的任何部分访问。因此我的控制器类可能如下所示:

public class Controller {
    public static ControllerA controllerA;
    public static ControllerB controllerB;
}

public class ControllerA {
    private JPanel panel1;
    private JPanel panel2;
    private DefaultListModel list;
}

...

每当我需要做某事时,我会这样调用控制器:

Controller.controllerA.doSomething

这意味着我的大部分代码都位于控制器内。通常,如果我需要做某事,控制器会有一个方法来完成它,并且它通常需要视图或模型中的一个等价的方法来完成任务。我发现这会导致代码重复。例如:

Controller.controllerA.removeElement();

将在控制器中调用以下方法:

protected void removeElement() {
    list.removeElement()
}

所以我的问题是:

  • 使用静态变量访问控制器对象是一种好的做法吗?
  • Controller->Model和Controller->View之间的代码重复是MVC的副作用吗?
  • 我这样做错了吗?如果是,您将如何在MVC中实现控制器?

共有1个答案

锺星腾
2023-03-14

使用静态变量访问控制器对象是一个好的实践吗?

不,您需要意识到,对于同一个视图(它的不同实例),您可以有多个控制器,所以这很快就变成了一个意大利面混乱的局面,并且很难控制和维护

Controller->Model和Controller->View之间的代码重复是MVC的副作用吗?

不,我会说那是糟糕的设计。您应该有这样的意图:视图可以由满足两者之间约定要求的任何控制器控制(视图知道如何与控制器通信,反之亦然),模型也是如此。一个控制器可以将许多不同的模型桥接到一个视图上...

我做错了吗?

伊霍,是的

如果是的话,您将如何在MVC中实现一个控制器?

从界面层次开始,设计界面,描述每个部分的期望、模型、该模型的控制器、视图和该视图的控制器。控制器很可能需要实现至少两个接口,以满足模型和视图的需求,但这意味着它不关心任何一个接口的实现。

模型和视图也一样,他们不应该关心控制器的实现,只应该关心它满足他们的契约要求。

Swing不实现纯MVC,因此尝试围绕Swing实现MVC会有很多问题。Swing控件是VC和模型分离的。这种方法有赞成也有反对。

话虽如此,您现在开始设置MVC的方法是一个很好的方法,视图中的UI相关元素、模型中的数据元素以及协调所有这些的控制器...

作为一个例子,您可以看一下Java和GUI-根据MVC模式,ActionListeners属于哪里?

 类似资料:
  • 本文向大家介绍ASP.NET MVC中将控制器分离到类库的实现,包括了ASP.NET MVC中将控制器分离到类库的实现的使用技巧和注意事项,需要的朋友参考一下 前言   在、ASP.NET MVC的开发中,我们创建完项目之后,ASP.NET MVC是已Model-Controller-View的形式存在的,在创建项目自动生成的内容上Model我们很容易分离成类库,所以这里不予说明,那么这时候我们就

  • spring MVC中controllin异常流的良好实践是什么? 假设我有一个DAO类,它将对象保存到数据库中,但如果违反了某些规则,例如名称太长、年龄太低,则抛出异常, 现在,如果我想保存名称超过10的A,它应该抛出异常。 但是有一个dataManipulator对象 和控制器 我希望在不抛出异常的情况下保留控制器(我听说这是一个很好的做法)。 但我的问题是,在这种情况下,A\u Data\u

  • ...Spring implements a controller in a very abstract way, which enables you to create a wide variety of controllers. 控制器作为应用程序逻辑的处理入口,它会负责去调用你已经实现的一些服务。通常,一个控制器会接收并解析用户的请求,然后把它转换成一个模型交给视图,由视图渲染出页面最终呈现

  • 问题内容: 如何获得Spring 3.0控制器来触发404? 我有一个带有控制器的控制器,对于要访问该控制器的某些URL,我希望该容器带有404。 问题答案: 从Spring 3.0开始,您还可以抛出带有注释声明的Exception :

  • 问题内容: 如何在控制器的JsonResult中渲染要使用的局部视图? 问题答案: 是一种自定义扩展方法,将视图呈现为。 文章中没有提到它(您最初提到的是什么),但是您可以在文章附带的示例代码中找到它。可以在\ Helpers \ Reders.cs下找到它 这是有问题的方法的代码:

  • 我有两个控制器< code>LoginViewController和< code>UserViewController 用户成功登录后,我需要将屏幕重定向到用户仪表板,并显示登录成功消息。 为此,可以使用两种方法 > < li> 由于我有一个在< code>UserViewController中加载用户仪表板的方法,所以我在< code>LoginViewController中自动连接了< cod