Swing框架之Model之二

Swing框架之Model之二

轻量级通知

       下面Swing中的模型使用轻量级通知,它们是基于 ChangeListener、ChangeEvent接口的:

ModelListenerEvent
BoundedRangeModelChangeListenerChangeEvent
ButtonModelChangeListenerChangeEvent
SingleSelectionModelChangeListenerChangeEvent


      ChangeListener接口只有一个通用方法:

public void stateChanged(ChangeEvent e)

      ChangeEvent中仅有的状态是事件源,因为所有通知中 的事件源 都是相同的,单独一个事件实例可以用作所有来自该模型的通知。使用此机制的模型支持下面的方法来添加和删除ChangeListeners:

   public void addChangeListener(ChangeListenerl)
   public voidremoveChangeListener(ChangeListenerl)

        获知JSlider数据发生变化的代码可以使用如下代码实现:

JSlider slider = new JSlider();
BoundedRangeModelmodel =slider.getModel();           
model.addChangeListener(new ChangeListener() {
      public voidstateChanged(ChangeEvent e) {
            // need to query themodel
            // to getupdatedvalue...
            BoundedRangeModel m= (BoundedRangeModel)e.getSource();
            System.out.println("model changed: "+
            m.getValue());
      }
});

       为给不想和分离式模型交互的程序提供方便,一些Swing组件类提供了直接在组件上注册ChangeListener的方法(组件可在组件内部侦听模型的 数据变化,并将事件传播给任何注册在组件上的Listener),这些通知的唯一区别是,使用模型注册方式的事件源是该模型实例,而使用组件注册方式的事 件源是该组件。

        因此我们可以将前面的例子简化成:

JSlider slider = newJSlider();
slider.addChangeListener(new ChangeListener() {
     public void stateChanged(ChangeEvent e) {
           //the source will be
           // the slider this time..
           JSlider s=(JSlider)e.getSource();
           System.out.println("valuechanged: "+ s.getValue());
     }
});

状态化通知

       支持状态化通知的模型根据它们的目的提供不同的Listener接口和事件对象。下表是这些模型接口和事件对象的类:

ModelListenerEvent
ListModelListDataListenerListDataEvent
ListSelectionModelListSelectionListenerListSelectionEvent
ComboBoxModelListDataListenerListDataEvent
TreeModelTreeModelListenerTreeModelEvent
TreeSelectionModelTreeSelectionListenerTreeSelectionEvent
TableModelTableModelListenerTableModelEvent
TableColumnModelTableColumnModelListenerTableColumnModelEvent
DocumentDocumentListenerDocumentEvent
DocumentUndoableEditListenerUndoableEditEvent

       Listener 除了 可以直接查询事件对象来跟踪内容 改变 外,这些API的作用与轻量级通知相似。比如下面的代码动态的跟踪JList被选中的项:

Stringitems[] = {"One", "Two", "Three");
JList list = new JList(items);
ListSelectionModel sModel =list.getSelectionModel();
sModel.addListSelectionListener (new ListSelectionListener() {
       publicvoidvalueChanged(ListSelectionEvent e) {
             // get change information directly
             // fromtheevent instance...
             if (!e.getValueIsAdjusting()) {
                  System.out.println("selection changed: " +
                  e.getFirstIndex());
             }
       }
});


自动视图更新

        模型没有任何表现它视图的固有知识,相反模型只有关心其状态改变的Listener列表,这种需求对于同个模型多个视图的框架来说是至关重要的。 Swing组件负责将合适的模型Listener连接起来,以便于模型改变时能正确地重画出自己。如果你发现模型改变时,组件不能自动更新,说明组件的实 现就存在错误。

忽略模型

        正如前面提到的,大多数组件直接在Component类中提供模型定义的API,以方便组件能不用和模型交互就直接操作,这是相当可行的编程方法,尤其是对于GUI状态模型来说。比如下面的JSlider内部getValue的实现,它将调用代理给模型:

public int getValue(){
      return getModel().getValue();
}

         因此程序完全可以这样写:

JSlider slider = new JSlider();
int value=slider.getValue();

Swing模型总结

         虽然理解了Swing模型设计是如何工作的,但没有必要在所有Swing编程中都使用模型API。你需要注意考虑应用程序各自的需求,决定哪儿使用模型API能帮你提升代码,且不带来不必要的复杂性。

         我特别推荐在Swing中使用应用数据模型(如JTable和JTree等的模型),因为从长期来看,它们能极大地提高你的应用程序可扩展性和模块化度。

IDEA用jformdesigner插件做管理系统MVC架构 在 IntelliJ IDEA 中结合 JFormDesigner 插件,通过 Swing 框架实现一个管理系统的 MVC 架构是一种经典的开发方式。以下是具体的步骤和实现思路,包含从项目创建到 MVC 架构的核心代码实现。 1. 项目结构设计为了… 阅读详情

相关推荐

AD(AltiumDesigner)封装导入allegro生成allegro封装

AD(AltiumDesigner)封装导入allegro生成allegro封装 貌似PCB的封装问题是一个无尽话题,为了简单我总是想找捷径(主要还是太懒了),因为也是近期才开始学习使用allegro进行PCB设计,在最近的一个设计中,很多器件封装allegro中都没有,一个一个画感觉很费时间,但是在AD(AltiumDesigner)的封装库中是有的,于是便想着AD的封装库能不能倒入到alleg...

yangh2560的博客 2万+

Swing框架之Model

构建应用程序应该以数据为中心,而不是以用户界面为中心,这是一个良好的编程习惯。为支持这种编程范式,Swing为每种带有逻辑数据或值的组件定义了独立的模型接口,这种分割使程序可以选择向Swing组件中嵌入自己的模型实现。       下面表格列出Swing中组件及其模型的映射关系: 组件 Model接口 Model类型 JButton ButtonModel GUI

expleeve 1608

[DA45] 使用PageRank算法分析希拉里邮件中的人物关系

一. 相关知识 (一) PageRank算法 PageRank 算法是 google 公司的创始人拉里·佩奇和谢尔·盖布林于1998年提出的网页搜索优化算法. 详细内容请见百度百科:google pagerank. 如果你了解了该算法, 就能明白上一段的超链接从本页面链出, 链入百度百科的 PageRank 算法页面增加了该页面...

Vincent_Chu的博客 2376

swing学习——Model

swing 组建的Model 大多数Swing组件都有自己的Model JButton---->ButtonModel:记忆了Button是否可选,可以被点击等等 JList---》ListModel持有了List的所有组件 JList--》SelectionModel跟

Dean_Deng的专栏 683

半导体AMHS系统振动控制技术演进:从0.5G到超低振动的工艺革命

在半导体制造进入埃米级时代后,AMHS的振动控制能力将成为区分厂商技术等级的标尺。国内企业通过“弹性机械设计-混合主动控制-智能调度”的三重创新,正逐步突破0.2G阈值,支撑12英寸晶圆厂向3nm/2nm制程升级。未来,振动抑制不再仅是物流系统的性能参数,而是与光刻、刻蚀等核心工艺深度耦合的基础能力,这将重塑半导体设备产业的竞争格局。

m0_60674045的博客 1584

GaN功率放大器设计避坑指南:从仿真到实测的Doherty PA完整流程(基于ADS 2023)

本文详细介绍了基于ADS 2023软件,从理论计算、电路仿真到版图后仿真的GaN Doherty功率放大器完整设计流程。文章聚焦C波段应用,深入剖析了负载调制网络设计、稳定性处理、版图电磁仿真等关键环节中的常见误区与工程折衷,为工程师提供了一套从设计到实测的实战避坑指南。

weixin_29238147的博客 529

java-swing-事件监听-ChangeEvent

ChangeEvent在组件值改变的时候会触发,比如说进度条的值改变。 关于ChangeEvent的一些信息: 事件名称:ChangeEvent 事件监听接口:ChangeListener 继承这个接口的类(监听者)需要重写stateChanged(ChangeEvent e1) 方法 事件相关方法:addChangeListener(),添加事件监听者。 需要导入的类: import javax...

大碗宽面的博客 3888

数通基础(基本网络通信原理、IP地址如何配置、DHCP、DNS域名系统、路由技术基础、静态路由 、TCP和UDP、vlan虚拟局域网、trunk、三层交换)

我们知道了1、电脑开机,通过dhcp获取ip地址2、电脑输入域名,www.baidu.com电脑把www.baidu.com发到自己的dns服务器3、dns服务器把域名解析成对应的ip地址4、电脑向百度服务器发送一个请求。

qq_53235556的博客 6476

Understanding Swing’s Model

 Understanding Swing’s Model 经常用Swing 开发Java GUI 程序的人一定听过这样的说法,Swing 控件是按MVC结构设计的。更准确地说,Swing是Model-driven的结构。但不同Swing控件的Model,其作用是否相同呢?比如当你在使用JButton时,你很少需要关心ButtonModel的存在,但在JTable使用时,你却总是需要用到

qiulang的专栏 1654

lammps教程:非晶sio2建模方法

大家好,我是小马老师。 本文介绍非晶sio2的建模方法。 sio2的建模方法有很多,可以下载cif文件使用atomsk转为data文件,也可以直接在ms中导入sio2结构,这些方法建的sio2都是标准的sio2晶体。 如果要建立非晶状态的sio2,就是把排列规则的sio2变成无序排列的sio2。 非晶建模方法有很多,在lammps中,可以通过高温高压的方法打乱sio2的排列实现非晶建模。 代码中的温度和步数可根据需要自己调整。 下面给出in文件案例代码。 units metal atom

lammps_jiayou的博客 5268

C++(Qt)软件调试---gdb调试入门用法(12)

学习GDB可以帮助程序员更好地调试程序,找到程序中的错误和问题,提高程序的质量和稳定性。 在开发大型软件时,程序中可能存在许多错误和问题,这些问题可能会导致程序崩溃或者出现不可预期的行为。 使用GDB可以帮助程序员更快地找到这些问题,并且提供一些调试工具来帮助程序员更好地理解程序的行为。

mahuifa的博客 5548

Swing框架之Model之一

Swing框架之Model之一      构建应用程序应该 以数据为中心,而不是以用户界面为中心,这是一个良好的编程习惯。为支持这种编程范式,Swing为每种带有逻辑数据或值的组件定义了独立的模型接口,这种分割使程序可以选择向Swing组件中嵌入自己的模型实现。        下面表格列出Swing中组件及其模型的映射关系: 组件 Model接口 Model类型 JBut...

topinking的专栏 198

【大模型】Coze AI 智能体工作流从配置到使用实战详解

Coze 扣子智能体工作流从配置到使用实战详解

congge 1万+

Java Swing interview

http://www.careerride.com/Swing-AWT-Interview-Questions.aspx Swing interview questions and answers for freshers and experienced candidates. These interview questions and answers on Swing...

weixin_33881050的博客 330

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Understanding Swing’s Model (转)

Understanding Swing’s Model (转)[@more@] Understanding swing’s Model XML:namespace prefix = o ns = "urn:schema...

ciya3282的博客 89

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Java Swing模型视图适配器介体

通常,我基于Spring Framework构建Java应用程序。 但是,最近有人要求我使用与语言无关的MVC框架PureMVC为客户端实现Java桌面应用程序,因此以下是我在Java Swing中为PureMVC进行员工管理展示的演示实现。 如果您想继续,可以在GitHub上找到可运行的演示。 Java Swing MVA演示 建筑总结 此应用程序使用了一个有趣的通用MVC模式的变体,...

最佳 Java 编程 253

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

通过Java Swing看透MVC设计模式

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

jokeHello的专栏 1412

MVC

Java Swing Swing是一个标准的MVC结构.ComponentUI代表View, 负责描画组件. 组件尤其Model层, 比如JTextField的Document, JTable的TableModel, JTree的TreeModel等等. 而Control可能不是很明显, 我们或许可以简单的将其Event机制看作一个Swing团队开发给开发者的Controller. 作为...

。。。。。。。 383

Swing的整体设计及MVC体系结构(转)

一:Swing的整体设计 1, 它是建立在Awt的基础之上,是Awt的增强版本,包括大多数的轻量组件的组件集和插入式外观。Swing的设计是基于MVC的体系结构,允许Swing组件被不同的数据模型和视图所替代,这样就产生了“可插入外观”。 2, Awt最初只包括对等到组件相关联重量组件,它们在自己的本地不透明窗口中绘制。轻量组件没有本地对等组件,而且它们在自己的重量容器中绘制。Swin...

iteye_1194的博客 329

从JList添加,删除项来看Swing的MVC框架设计

MVC顾名思义即Model,View,Control. Swing中的控件均是采用MVC来设计的,非常高级的设计,自我认为的啊,不过刚接触就感觉云山雾绕,很难理解,毕竟自己从C语言一步一步学过来的。最开始数据,函数基本都是写在一个文件中,后来发现很多人提到了模块化编程,也就是把各个功能分到不同的文件中编写,这样文件多了,函数也做了分类,也被分配到了不同的文件中,同时的问题就是变量的全局和局部的

netwarning的专栏 2313

Swing编程基础 之四

MVC(Model-View-Control)体系结构Swing胜过AWT的主要优势在于MVC体系结构的普遍使用。在一个MVC用户界面中,存三个通讯对象:模型、视图和控件。模型(Modle)是指定的逻辑表示法,视图是模型的可视化表示法,而控件则指定了如何处理用户输入。当模型发生改变时,它会通知所有依赖它的视图,视图使用控件指定其相应机制。为了简化组件的设计工作,在Swing组件中视图和控件两部分合...

weixin_34167819的博客 270

java 第三方 swing_Swing 第三方工具设计

Swing第三方工具设计时间:2006-07-18 00:00 来源:bitsCN.com 字体:[大 中 小]Swing是Java为桌面开发而设计一个重要GUI工具包,整个设计是基于AWT技术上的扩展。加上Java在网络的优势和跨平台的特点,Swing已经无处不在,在Java2D的性能加强,可插入式的Look AndFeel,主题(Theme)和JDK5.0"Tiger"的出现后,基于Swin...

weixin_28748205的博客 681
上一篇: Swing框架之Model之一
下一篇: Creating Interactive GUIs with Swing's MVC Archite
topinking
博客等级 码龄20年 15粉丝 242原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值