swing之mvc模式

Swing MVC体系结构浅析 Swing MVC体系结构浅析1 Swing与MVC<br /><br />  Swing组件设计使用了著名的MVC模型-视图-控制器体系结构。为了了解MVC体系结构与Swing组件的关系,我们来看一下如何设计一个表示按钮的组件,因为按钮的各个部分可以与MVC体系结构的3个部分对应起来。<br />  按钮在任意给定时刻,可处于启用和无效两种状态之一。很显然,按钮只有处于启用状态时才会响应点击。记录按钮状态是很有用的,视图需要根据按钮的状态进行不同的渲染。按钮的所有状态就是MVC体系结构的模型部分。模型还包 阅读详情

1 Swing与MVC

  Swing组件设计使用了著名的MVC模型-视图-控制器体系结构。为了了解MVC体系结构与Swing组件的关系,我们来看一下如何设计一个表示按钮的组件,因为按钮的各个部分可以与MVC体系结构的3个部分对应起来。

  按钮在任意给定时刻,可处于启用和无效两种状态之一。很显然,按钮只有处于启用状态时才会响应点击。记录按钮状态是很有用的,视图需要根据按钮的状态进行不同的渲染。按钮的所有状态就是MVC体系结构的模型部分。模型还包括按钮的其他属性。

  你现在了解到按钮在模型中保存其状态,视图是按钮的图形表示,它使用模型来确定如何绘制按钮。按钮的另外一个重要功能是,它的状态可以改变-当你用鼠标点击它,或者当它处于焦点时按空格或回车键,即可激活按钮。显然,必须有某些东西来监控鼠标和键盘以及按钮得到或失去焦点的情况,以便注意到必要的状态改变。组件负责接收和响应输入的部分就是控制器。

  我们用图来表示所有这些。下图说明了在MVC体系结构中按钮的各个部分的表示。

  现在假定用户用鼠标点击按钮。通过控制器可以探测到该操作,并将其解释为点击按钮的请求。一次点击实际上需要两个步骤-首先按钮被按下然后又被释放。当按下鼠标时,控制器告诉模型改变它的状态,以反映按钮已经按下的事实。现在按钮需要重新绘制,这样可以看到按钮被按下了。要使该重新绘制发生,模型需要生成一个事件,通知视图它的状态已经改变,在收到该事件时,视图向模型查询它的新状态并据此重画按钮。当用户释放鼠标时,控制器将探测到它并再次改变模型,以便使按钮的状态改变到并未按下。这使得模型向视图产生另一个事件,结果按钮会重新绘制成弹出状态。这种从压下到弹出的特定状态改变,还使得模型产生另一个事件,可以发送到应用程序代码,表示按钮已经被点击了。

  Swing按钮是JButton,实际上它由几部分组成:

  1、实现模型的类的实例。如果是普通的按钮,该类是DefaultButtonModel。

  2、知道如何绘制按钮的类的实例,它完成视图的任务。对普通的按钮而言是BasicButtonUI。

  3、响应用户输入的类的实例,这时控制器的任务。对于按钮来说,该角色由BasicButtonListener类担任。

  4、一个包装类,提供按钮的编程接口并隐藏其他部分,即JButton。

2 控制器内部实现机制

  现在我们已经了解到MVC的控制器在Swing中用来监控鼠标、键盘以及组件获得失去焦点等。当鼠标被按下时,AWT-Windows线程从底层操作系统捕获到这个消息,然后放入一个EventQueue事件队列中,AWT事件调度线程从该事件队列取出这个消息事件并派发该事件,最终BasicButtonListener在事件处理方法中改变模型中的状态,而模型状态改变会导致视图重新绘制以反映模型的状态改变。

 

  EventQueue的dispatchEvent方法会调用对应的Component对象的dispatchEvent方法,最终会调用不同的xxxListener的不同事件处理方法。当鼠标在按钮上按下时,最终会调用BasicButtonListener的mousePressed( MouseEvent e )方法,该方法会改变DefaultButtonModel的状态以表示按钮已被按下,最后模型发送事件通知视图重画。

3、源代码分析

 

 swing进行事件分发,当按钮按下时,BasicButtonListener进行处理,关键代码如下:


public void mousePressed(MouseEvent e) {  
       if (SwingUtilities.isLeftMouseButton(e) ) {  
      AbstractButton b = (AbstractButton) e.getSource();  
  
      if(b.contains(e.getX(), e.getY())) {  
          long multiClickThreshhold = b.getMultiClickThreshhold();  
          long lastTime = lastPressedTimestamp;  
          long currentTime = lastPressedTimestamp = e.getWhen();  
          if (lastTime != -1 && currentTime - lastTime < multiClickThreshhold) {  
          shouldDiscardRelease = true;  
          return;  
          }  
    <span style="color:#ff0000;">//改变model层  
</span><span style="color:#ff0000;">         ButtonModel model = b.getModel();  
         if (!model.isEnabled()) {  
            // Disabled buttons ignore all input...  
        return;  
         }  
         if (!model.isArmed()) {  
        // button not armed, should be  
                model.setArmed(true);  
         }  
</span>      model.setPressed(true);  
         if(!b.hasFocus() && b.isRequestFocusEnabled()) {  
            b.requestFocus();  
         }              
      }   
       }  



DefaultButtonModel类



public void setArmed(boolean b) {  
    if(isMenuItem() &&   
            UIManager.getBoolean("MenuItem.disabledAreNavigable")) {  
        if ((isArmed() == b)) {  
            return;  
        }  
    } else {  
        if ((isArmed() == b) || !isEnabled()) {  
            return;  
        }  
    }  
          
    if (b) {  
        stateMask |= ARMED;  
    } else {  
        stateMask &= ~ARMED;  
    }  
        <span style="color:#ff0000;"> fireStateChanged();//发送事件 变更消息,其中包括BasicButtonListener类,触发重新渲染操作  
an>    }  


BasicButtonListener的状态改变处理逻辑:


public void stateChanged(ChangeEvent e) {  
tractButton b = (AbstractButton) e.getSource();  
    b.repaint();  
} 

MVC结构图:

 


原文链接:http://blog.youkuaiyun.com/hanruikai/article/details/7446782

深入理解MVC模式在Java Swing中的应用 本文深入探讨了MVC(Model-View-Controller)设计模式在Java Swing应用程序中的实践应用。通过分析源代码,揭示了如何在主视图类(MainView)中处理菜单和工具栏,以及如何在电影列表视图类(MovieListView)中实现电影列表的浏览和更新。文章展示了MVC模式中各个组件之间的交互细节,并通过实际代码案例,提供了一个复杂用户界面逻辑如何被清晰、有效地组织的视角。 阅读详情

相关推荐

深入理解AWT事件与Swing MVC模式

本文深入探讨了Java AWT事件处理机制,包括语义事件与底层事件的区别,以及AWT监听器接口与适配器类的作用。接着,重点介绍了Swing组件的模型–视图–控制器(MVC)设计模式,分析了其在Swing用户界面设计中的应用,以及如何通过MVC模式实现界面的可插拔观感和组件的复用。

weixin_42573757的博客 905

java swing开发窗体程序开发(四)MVC结构

MVC是一种设计结构(非设计模式,非设计原则) M:Model 模型层:即用于存储数据的对象 V:View 视图层:即用于为模型提供数据显示的对象 C:Controller 控制器层:即处理用户的业务逻辑(交互操作),对用户的操作做出相应,让模型和视图进行必要的交互。 在java swing中可以理解为 将某个对象视为“模型”,然后为该“模型”提供恰当的显示组件,即“视图”,为了响应用户的操作,让...

(˶˚ ᗨ ˚˶)来康康我 4121

在Java Swing中实现MVC设计模式(英文)

Model-View-Controller (MVC) Design Pattern

swing实现MVC模式实现增删改查+排序系统3.0【java基础---图形界面----swing实现MVC模式】

swing实现MVC模式实现增删改查+排序系统3.0【java基础---图形界面----swing实现MVC模式】

伟庭的博客 1189

java swing的mvc模式的简单框架

java swing的mvc模式的简单框架,应用了用观察者模式于gui和控制器之间,将gui作为一个对象传进控制器进行处理,这个简单框架的控制器那里还有待改进。这个代码中包含了使用框架的简单例子在里面

Swing MVC 代码示例

Swing MVC 代码 示例 Swing MVC 代码 示例

通过 Java Swing 看透 MVC 设计模式

一个好的用户界面(GUI)的设计通常可以在现实世界找到相应的表现。例如,如果在您的面前摆放着一个类似于电脑键盘按键的一个简单的按钮,然而就是这么简单的一个按钮,我们就可以看出一个GUI设计的规则,它由两个主要的部分构成,一部分使得它具有了按钮应该具有的动作特性,例如可以被按下。另外一部分则负责它的表现,例如这个按钮是代表了A还是B。看清楚这两点你就发现了一个很强大的设计方法,这种方法鼓励重用reu

灰虫轨迹 1220

黑五数据集实战:从消费者行为解码到零售智能决策

零售智能决策依赖对消费者行为的深度理解,其核心在于将结构化字段还原为真实商业动作。本文基于经典Black Friday数据集,系统阐释如何通过字段语义重定义、业务驱动的特征工程、轻量高效模型(如LightGBM)及定制化损失函数,构建可落地的库存预警、流失拦截与动线优化方案。重点融合‘消费人格指纹’与‘生态位稳定性分’两大热词,揭示数据背后的城市引力场、品类竞争网络与决策节奏图谱,为电商、快消及零售从业者提供从数据分析到业务闭环的完整方法论。

weixin_28630185的博客 345

java 用swing能mvc吗,Java Swing的MVC模式 - java

我有一个使用MVC模式开发Java Swing应用程序的想法。我已经在下面描述了我的想法,请让我知道,这是对Java Swing使用MVC模式的正确方法吗?这是观点以下方法用于获取和设置以上视图的名称,//at top of the view its model and controller is defined asModel model = null;Controller controller...

weixin_29324401的博客 454

Oracle 19c RAC安装踩坑实录:OpenSSH 8.x版本与OUI的“兼容性战争”及一劳永逸的解决思路

本文深入解析Oracle 19c RAC在Linux8环境中部署时遇到的OpenSSH 8.x版本兼容性问题,特别是[INS-06006]错误的根源与解决方案。从协议层分析冲突本质,提供SCP包装器技术、官方补丁应用指南及现代化部署体系构建三种解决方案,帮助企业高效完成RAC安装并规避类似问题。

weixin_42648844的博客 458

别再只会用Excel了!Minitab 21手把手教你搞定SPC控制图(从数据导入到结果解读)

本文详细介绍了如何使用Minitab 21高效制作SPC控制图,从数据导入到结果解读的全流程。通过对比Excel的局限性,展示Minitab在自动化计算、图表标准化和特殊原因检验等方面的优势,帮助质量管理人员提升工作效率和数据分析专业性。

weixin_30878501的博客 385

透过Java Swing深入掌握MVC设计模式

  一个好的用户界面(GUI)的设计通常可以在现实世界找到相应的 表现。例如,如果在您的面前摆放着一个类似于电脑键盘按键的 一个简单的按钮,然而就是这么简单的一个按钮,我们就可以看 出一个GUI设计的规则,它由两个主要的部分构成,一部分使得 它具有了按钮应该具有的动作特性,例如可以被按下。另外一部 分则负责它的表现,例如这个按钮是代表了A还是B。   看清楚这两点你就发现了一个很强大...

无有间的专栏 343

【AIGC】COT思维链:让AI学会拆解问题,像人一样思考

COT思维链的出现,为AI的发展开辟了一条新的道路。它让AI学会了像人类一样思考,将复杂问题分解成简单的步骤,并逐步推理出最终答案。希望我的引导会对你产生启发。

智兔唯新的博客 9002

Swing组件都采用MVC设计模式

Swing组件都采用MVC(Model-View-Controller,既模型-视图-控制器)设计模式,从而可以实现GUI组件的显示逻辑和数据逻辑的分离,允许程序员自定义Render来改变GUI组件的显示外观,提供更多的灵活性。 1 package Com.SwingTest; 2 3 4 5 import javax.swing.*; 6 ...

dengjuanshou7445的博客 785

C#上位机+TensorFlow Lite 轻量化AI模型部署实战(工业级完整版,低算力工控机首选)

工业自动化轻量化AI部署指南:C# + TensorFlow Lite实战 摘要:本文针对工业自动化领域机器视觉部署的痛点,提出基于C#和TensorFlow Lite(TFLite)的轻量化解决方案。该方案完美适配低算力工控环境(J1900/2G内存),具有以下核心优势:1)极致轻量化,模型体积仅KB-MB级;2)CPU深度优化,单帧推理≤15ms;3)零环境依赖,纯C#部署;4)工业级稳定性,7×24小时运行。教程涵盖从环境搭建、模型转换到C#封装的完整流程,特别提供YOLOv8等工业常用模型的TFLi

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1030

【气候模式降尺度】分位数增量映射(QDM)原理及MATLAB代码实现

简介QDM原理及其MATLAB代码实现

WW、forever的博客 5861

通过JAVA SWING看透MVC设计模式

通过JAVA SWING看透MVC设计模式        一个好的用户界面(GUI)的设计通常可以在现实世界找到相应的表现。例如,如果在您的面前摆放着一个类似于电脑键盘按键的一个简单的按钮,然而就是这么简单的一个按钮,我们就可以看出一个GUI设计的规则,它由两个主要的部分构成,一部分使得它具有了按钮应该具有的动作特性,例如可以被按下。另外一部分则负责它的表现,例如这个按钮是代表了A还是B。

我爱翰宝宝 2307

游戏开发中的CV:实时动作捕捉与虚拟交互

游戏开发中的CV:实时动作捕捉与虚拟交互​ ,人工智能,计算机视觉,大模型,AI,在当今游戏产业中,玩家对游戏体验的要求日益提高,追求更加真实、沉浸的交互感受。计算机视觉(Computer Vision,CV)技术的飞速发展,为游戏开发带来了革命性的突破,其中实时动作捕捉与虚拟交互技术更是成为提升游戏品质的核心驱动力。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 16万+

通过Java Swing看透MVC设计模式

   作者:vipcowrie编译     一个好的用户界面(GUI)的设计通常可以在现实世界找到相应的表现。例如,如果在您的面前摆放着一个类似于电脑键盘按键的一个简单的按钮,然而就是这么简单的一个按钮,我们就可以看出一个GUI设计的规则,它由两个主要的部分构成,一部分使得它具有了按钮应该具有的动作特性,例如可以被按下。另外一部分则负责它的表现,例如这个按钮是代表了A还是B。

myali88的专栏 1087

AUTOSAR进阶图解==>AUTOSAR_SWS_ADCDriver

本文深入解析了AUTOSAR ADC Driver的架构设计和技术实现。主要内容包括:1)ADC Driver在AUTOSAR分层架构中的定位及核心功能;2)详细的模块架构设计,涵盖初始化管理、组转换管理、优先级处理等核心子组件;3)全面的配置模型说明,包括主配置类、通用配置、通道配置等关键数据结构;4)状态机机制和操作序列分析。通过分层设计和标准化接口,ADC Driver实现了硬件抽象和软件解耦,提供了良好的可移植性和可维护性。

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 786

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

swing和mvc模式

swing的结构:     1 model:存储组件数据:         一,存储组件内将被用来操作的数据:如tableModel,ListModel等,用来显示不同的数据显示方式。         二,存储控制组件操作模式的数据:如liseSelectionModel         三,存储组件本身性质的数据:如jslider组件有minimum,maximum.event与value四个参

mpan03的专栏 572

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: Swing程序最佳架构设计—以业务对象为中心的MVC模式
下一篇: 在Swing和Swt中使用JavaFX
混魔MJM
博客等级 码龄9年 57粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值