Swing框架之Component:续文三

Swing框架之Component:续文三

Swing事件与事件处理器模型

         Component在Swing模型中是事件触发源。前一篇文章在描述Swing的事件处理模型时就已经提到了这个事件处理过程。简单来说,Swing组 件在侦听到原生事件并处理后,往往产生新的逻辑事件。逻辑事件是某些组件所特有的、具有特定语义的事件,比如JButton按下时产生 ActionEvent、JComboBox一项被选中时产生ItemEvent,等等。和原生事件不同,它们并不被派发到系统事件队列中,而是由组件直 接触发。事件处理器作为组件的观察者添加到组件上并侦听触发的事件。假设事件名叫XXX,Swing中实现这个模式的一般模式是:

1.定义一个XXXEvent

public class XXXEvent extends Event{
    ...
    public void XXXEvent(Object src){
        super(src);
        ...
     }
   
...
}

2.定义一个事件处理器接口XXXListener,声明所有和该事件相关的处理方法:

public interface XXXListener extends EventListener{
    void action1(XXXEvent evt);
    void action2(XXXEvent evt);
    ...
}

3.在触发它的组件中定义一下方法:

public class MyComponent extends Jcomponent{
   
...
   
//存放事件处理器的队列
   
private ArrayList<XXXListener>xxxListeners=new ArrayList<XXXListener>();
       
//定义以下各种方法,访问符号用public,以方便添加删除处理器
       
public void addXXXListener(XXXListener listener){
           
xxxListeners.add(listener);
       
}
       
public void removeXXXListener(XXXListener listener){
           
xxxListeners.remove(listener);
       
}
       
//定义各种触发(fire)action1、action2...的方法,注意一般使用protected,以便继承和扩展
       
//每一个action都要定义一个相应触发(fire)的方法
       
protected void fireAction1(XXXEvent evt){
           
for(XXXListener listener:xxxListeners){
               
listener.action1(evt);
           
}
       
}
       
protected void fireAction2(XXXEvent evt){
           
for(XXXListener listener:xxxListeners){
               
listener.action2(evt);
       
}
   
}
   
...
   
//在某些地方,比如鼠标处理函数中触发相应的动作
   
void myMouseReleased(MouseEvent evt){
       
...
       
if(应该触发action1)
           
fireAction1(new XXXEvent(this));
       
...
       
if(应该触发action2)
           
fireAction2(new XXXEvent(this));
       
...
    
}
}

         XXXEvent、XXXListener、addXXXListener、removeXXXListener以及各种fireAction函数多是重复性代码,有些Java IDE如JBuilder中能够根据开发者的指定参数的自动生成这些代码。

         实际上这个观察者模式的编程范式可以推广到任何JavaBeans,不一定是可视化的Swing组件。以前曾经见过JBuilder做的一个所谓数据库操 作的JavaBeans,它没有界面,但它和Swing组件完全一样添加删除处理器。它的功能是异步操作数据库,在数据操作完了之后触发注册在上面的事件 处理器,该事件处理器就可以将查询结果展现在表格中,或者输出成报表等等。

         在这个模型中,JavaBeans本身既可以是事件源(被观察对象),也可以是事件处理器(观察者),JavaBeans也可以侦听自身的事件并且处理。 比如前面文章所提的MyButton在处理鼠标事件时就是自己侦听自己发出的鼠标事件,自己既是事件源,又是事件处理器,形成自反系统。各种各样的 JavaBeans通过这种机制联系成一张事件网,各种JavaBeans就是这个网上的节点,而它们之间的事件触发与事件处理关系就是这张网络上的线。 当某个节点被外界或自身发出的事件所触发时,行成了事件的传播。这个过程很像网络上节点的振动引起周围周围节点振动的模型。下图示意了这种 JavaBeans之间的事件网:

         例如new JscrollPane(new JtextArea())这个系统,它里面包括两个JScrollBar和一个JTextArea,当鼠标拖动事件触发JScrollBar时, JScrollBar处理了这个鼠标拖动事件,并发出滚动条拖动事件,这个事件传播给JTextArea,JTextArea处理这个拖动事件,相应的更 新自己显示的内容,如果JTextArea之后又根据更新发出了一个新的事件,这个事件便会继续传播下去。

Swing布局管理器

         现在高级图形用户界面工具一般都包括布局管理器机制。什么叫做布局管理器?如果所有窗口的大小是不变的,那么我们在往窗口中添加组件时,只要将组件的拖放 到固定位置、调整好尺寸就可以了,就像VB的界面工具一样。可大多数情况并非如此,用户经常需要调整窗口的大小,以便和其他程序协同工作。这种情况下,在 传统界面工具中,比如VB,就需要显式的侦听窗口尺寸调整事件,根据当前窗口的大小重新计算并调整各个组件的大小和位置。AWT/SWT/Swing将这 个过程自动化、模块化了,抽象出一个布局管理器来负责管理界面组件的布局。

         它们实现原理是相似的:容器类组件侦听初始化、invalide/validate以及容器尺寸调整等事件,一旦发生这些事件,容器类组件检查自己是否配 置了布局管理器,如果没有,则不做任何事情;如果有,则将容器内组件的布局代理给布局管理器,让它来完成容器内组件的重新布局。

         容器管理器对象对实现两类接口:LayoutManager和LayoutManager2,LayoutManager2是LayoutManager的一个扩展,允许组件在添加时指定位置参数。它们的定义和含义如下:

public interface LayoutManager {
   
//添加组件comp,并和name关联起来,name可以作为位置等特殊含义参数来使用
   
void addLayoutComponent(String name, Component comp);
   
//删除组件comp
   
void removeLayoutComponent(Component comp);
   
//根据容器内的当前组件,计算容器parent的最优尺寸。
   
Dimension preferredLayoutSize(Container parent);
   
//根据容器内的当前组件,计算容器parent的最小尺寸。
   
Dimension minimumLayoutSize(Container parent);
   
//重新布局容器parent,这儿是主要布局逻辑所在。
   
void layoutContainer(Container parent);
}
public interface LayoutManager2 extends LayoutManager {
   
//添加组件comp,constraints用作指定如何以及位置的参数,这个函数主要是弥补LayoutManager版的addLayoutComponent表达能力欠缺而添加。
   
void addLayoutComponent(Component comp, Object constraints);
   
//根据容器内的当前组件,计算容器parent的最大尺寸。看来除了最优、最小,某些情况下还是需要知道最大。
   
public Dimension maximumLayoutSize(Container target);
   
//指定水平方向上组件之间的相对对齐方式,0表示和源组件对齐,1表示远离源组件。
   
public float getLayoutAlignmentX(Container target);
   
//指定垂直方向上组件之间的相对对齐方式,0表示和源组件对齐,1表示远离源组件。
   
public float getLayoutAlignmentY(Container target);
   
//invalidate这个布局管理器,有时布局管理器为了计算迅速,可能第一次计算之后就将一些数据给缓冲,但是后容器内的组件数目发生变化,这儿的缓冲值就需要调用这个方法通知更新
   
public void invalidateLayout(Container target);


}

         Swing在java.awt和javax.swing中都分别提供大量的布局管理器,这些布局管理器有简单的如FlowLayout,有复杂的如GridBadLayout。用户还可以自己定义自己的布局管理器,由于篇幅原因,这儿略去例子。

         Java 6中在布局管理中引入了BaseLine / Anchor的概念,能协助Java IDE的用户界面设计工具,方便用户来设计布局组件。NetBeans的Matisse组件首先引入了一个GroupLayout布局管理器,结合 Matisse使用,提供了非常方便的布局管理和界面设计。GroupLayout和BaseLine/Anchor概念以及Matisse可以说是 Java界面设计工具的一大进步,可以说足以成为Java桌面应用史上的一个里程碑。在这之前,缺乏有力的界面设计工具是Java在桌面应用失败的一个重 要原因。虽然Anchor概念早就在Delphi界面设计工具出现过,但是这个工具的出现还是Java界面设计史上的一大事件。随着Java 6桌面应用支持的增强,以及NetBeans Matisse之类界面设计工具的出现,使得Java桌面应用时代已经到来。Seeing is believing,你不妨试一下就知道了。

=====================================

         本想再加一节讲述Swing双缓冲机制,但是想到双缓冲并不是Swing模型的核心概念,没有它并不影响理解Swing的总体模型,因此打算把它作为以后的一篇专门技术文章来写。

         这样Swing模型中的Component部分就算是描述完了,从明天开始,讲述Swing模型中的另外三个重要概念:Model、UI Delegate和Renderer。

图解B树的原理及操作 本文主要参考:https://blog.youkuaiyun.com/shenchaohao12321/article/details/83243314 1. B树 1.1 B树的定义 B树也称B-树,它是一颗多路平衡查找树。我们描述一颗B树时需要指定它的阶数,阶数表示了一个结点最多有多少个孩子结点,一般用字母m表示阶数。当m取2时,就是我们常见的二叉搜索树。 一颗m阶的B树定义如下: 1)每个结点最多有m-1个关键字。 2)根结点最少可以只有1个关键字。 3)非根结点至少有Math.ceil(m/2)- 阅读详情

相关推荐

Lucene学习总结之二:Lucene的总体架构

Lucene总的来说是: 一个高效的,可扩展的,全文检索库。 全部用Java实现,无须配置。 仅支持纯文本文件的索引(Indexing)和搜索(Search)。 不负责由其他格式的文件抽取纯文本文件,或从网络中抓取文件的过程。 在Lucene in action中,Lucene 的构架和过程如下图, 说明Lucene是有索引和搜索的两个过程,包

forfuture1978的专栏 1万+

Java学习指南(Swing高级篇)

☆ Java程序员居家旅行必备课程 ☆Java学习指南系列的第4篇,介绍基于Java Swing的的高级应用技术。本篇的前一篇是Swing入门篇。Swing系列教程分为两篇:(1) Swing入门篇 (2) Swing高级篇。本篇内容至少包含:- 高级绘制技术,包含线型、渐变色、文本的精确绘制- 不规则形状及图表的绘制- 工作线程与界面线程的原理- 短任务、长任务、定时任务的应用举例- 弹出式窗口 Popup的使用方法- 短消息提示 Toaster 的设计与使用- 事件处理机制,鼠标键盘事件处理,以及一个基于键盘操作的“推箱子”游戏 - 多行文本的显示- 图片操作:缩放、剪裁、旋转、镜像,以及一个屏幕截图程序的实例- 管理型应用界面的框架- 向导型应用界面的框架- 文档型应用界面的框架- 拖放支持 Drag & Drop,一个可拖拽排序的列表,以及一个拼图游戏的实现* 课程特色 *轻快 - 采用小章节教学,学起来轻松实用 - 以实际工程需要出发来设计课程有趣 - 穿插大量特效实例,增加趣味性和学员的成就感专业 - 课程中采用的代码库,就是经过良好封装的成熟的库本篇穿插多个实例,通过实例,综合运用多种技术,使学员对项目的构建有所有认识。

远程桌面报‘数据加密错误‘?可能是网卡设置惹的祸(附TCP校验关闭教程)

本文深入分析远程桌面连接中出现的'数据加密错误'问题,指出网卡设置可能是根本原因,并提供详细的TCP校验关闭教程。通过禁用网卡高级属性中的'TCP校验和IPv4'与'IPv4承载卸载'功能,可有效解决RDP协议与硬件加速的兼容性问题,适用于Windows和Linux系统。

view3的博客 276

java-swing-高级控件初步-菜单

菜单就是位于窗口顶部的一排类似按钮的东西,eg: 上面窗口中就有一个菜单栏,三个菜单,分别是“菜单”,“编辑”和“文件”。 当点击菜单时,会弹出这个菜单中的所有菜单项,eg: 上面当点击“菜单”后,弹出了它的四个菜单项,还有一个分割符。 菜单由JMenu类实现,菜单项(菜单子项)由 JMenuItem类实现,创建了菜单,还要将其添加到菜单栏上,菜单栏由JMenuBar 类实现。 现在给窗口创建...

大碗宽面的博客 945

Silvaco Atlas新手入门:从安装到第一个半导体器件仿真(附DeckBuild配置)

本文为Silvaco Atlas新手提供了一份从软件安装、DeckBuild环境配置到完成第一个半导体器件仿真的实战指南。通过构建一个经典的PN结二极管案例,详细讲解了Atlas仿真语句的语法、核心命令顺序以及结果调试与可视化方法,帮助初学者快速上手并理解TCAD仿真流程。

sql99的博客 332

手把手教你用UC3842搭建12V/5A反激电源(附PSIM仿真文件)

本文详细介绍了基于UC3842的12V/5A反激电源设计与PSIM仿真实践。从UC3842芯片选型、高频变压器计算到PSIM仿真模型搭建,提供完整的开关电源设计流程。特别包含PCB布局要点和实测优化建议,帮助工程师快速掌握反激电源开发技巧。

u6v7w8x的博客 1202

Swing框架之Component:续文一

Swing框架之Component:续文一 (2007-01-09 21:30:56) 转载▼   分类: Swing          昨晚回去后还是觉得Component对象本身说的太简单,想来想去,觉得内容实在是太多,有必要补充两个续文说明Component的其它概念。今天介绍Swing组件paint方法的处理流程,这个流程能使我们理解许

。。。。。。。 1555

ALSA音频开发实战:如何用snd_pcm_avail避免缓冲区溢出(附完整代码)

本文深入探讨了在ALSA音频开发中,如何利用`snd_pcm_avail`函数有效管理环形缓冲区,从而避免音频数据溢出或下溢。通过实战代码示例,详细解析了该函数在播放场景下的核心作用,即实时查询可写入的帧数,并构建了自适应写入循环以实现稳健的流量控制,确保音频流的平滑与稳定。

weixin_29183637的博客 461

Swing框架之Component:续文二

2008 - 05 - 06 Swing框架之Component:续文二          Swing的事件处理过程为:事件调度线程(Event Dispatch Thread)从事件队列(EventQueue)中获取底层系统捕获的原生事件,如鼠标、键盘、焦点、PAINT事件等。接着调用该事件源组件的 dispachEvent。该方法过滤出特殊事件后,调用processEvent进行处理...

topinking的专栏 157

OpenCV实战(24)——相机姿态估计

如果物体的 3D 结构是已知的,那么就可以预测物体如何投影到相机的传感器上,图像形成的过程由投影方程描述。当方程的大部分项已知时,就可以通过观察一些图像来推断其他元素 (2D 或 3D) 的值。相机姿态估计就是通过几个已知坐标的特征点,以及这些点在照片中的成像位置,求解出相机位于坐标系内的坐标与旋转角度。在本节中,我们将研究观察已知 3D 结构时的相机姿态估计问题。

盼小辉丶的博客 2万+

【学习系列】SAP RAP 3:添加多层级的子节点

本文详细介绍了在SAP ABAP RAP开发中如何创建多层级业务对象。主要内容包括:1)创建明细和计划行层级的数据库表及CDS视图;2)使用association和composition关键字建立父子关联关系;3)创建各层级的投影视图并设置层级关系;4)更新行为定义,添加关联、操作权限等控制;5)更新服务定义公开新增视图;6)创建元数据扩展优化UI展示。通过这一系列步骤,实现了从抬头到明细再到计划行的完整业务对象层级结构,为后续UI功能扩展奠定了基础。

DeveloperMrMeng的博客 587

探究 Z-Order

Z-order,也有人称为 Zorder,指的是对象之间的层次关系。举个简单的例子:在使用 PowERP oint 制作文件时,当你把文件上被其它对象盖住的某个对象「上推至最顶层」,你就是在改变它的 Z-order。通常 Z-order 高者置于 Z-order 低者的「上面」。 通常 GUI 程序设计都会用到 Z-order 的...

topinking的专栏 2114

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

swing 框架之Render(一)

http://fifa899.iteye.com/blog/201604   swing 框架之Render(一)   Swing组件根据其所操作的数据类型分为两种,一种是标量数据类型的组件,一类是复合数据类型的组件。标量数据类型的组件操作的是基本类型的数据,如字 符串、布尔、数字等,此类型组件包括JTextField、JCheckBox、JLabel、JButton等。复合数据类型的组件操作的是...

topinking的专栏 972

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

[Swing]JTable 表头显示问题收藏

http://blog.youkuaiyun.com/sting2005/archive/2007/03/13/1527953.aspx    JTable组件显示数据时,如果直接将其放置在Frame的contentPane中则表头一行会显示不出来,如果将其放置在JScrollPane中显示数据的话,表头会自动显示出来。 引用Sun的原话为: It's easy to put a table in a scr...

topinking的专栏 478

VC中sqlite的使用

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

Swing框架之Component

  Swing框架之Component          昨天晚上写完Swing的模型和渲染器之后,觉得对Swing的体系结构还是没有说清楚。Swing的基础体系结构中的四大基本对象Component、 Model、UI Delegate以及Renderer都值得详细解释。Swing的树状组件结构(虽然这是用户界面工具通有的特征)也值得详细解释,因为这是完成某些复 杂Swing组件,尤其像JT...

topinking的专栏 302

Swing模型与渲染器

关键字: swing 本 文承接Swing/AWT/SWT比较一文,概要叙述Swing的体系结构,解释了Swing架构关键概念:模型与渲染器,解释如何使用渲染对象扩展该体 系架构来支持大数据量的组件。后面的文章还会简要概述SWT的体系结构,为Swing/AWT和SWT的比较做一铺垫。 ===================================== Java 基础...

topinking的专栏 211

POI读写Excel文件(转)- -

http://wwbf1983.blogdriver.com/wwbf1983/1256690.html     POI读写Excel文件(转)- - 一、Excel基础二、HSSF概况 三、通过usermodel读取文件 四、通过usermodel写入文件 五、通过eventusermodel读取文件 六、...

topinking的专栏 203

Swing框架之Model之一

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

topinking的专栏 198

Swing框架之Model之二

Swing框架之Model之二 轻量级通知        下面Swing中的模型使用轻量级通知,它们是基于 ChangeListener、ChangeEvent接口的: Model Listener Event BoundedRangeModel ChangeListener ChangeEvent ButtonModel ChangeListener ChangeE...

topinking的专栏 191

Creating Interactive GUIs with Swing's MVC Archite

http://www.developer.com/java/ent/article.php/3336761     Part 1: Model-View-Controller and Swing Many GUI-based applications, client interfaces, and widget toolkits use the Model-View-Controller (M...

topinking的专栏 181

通过Java Swing看透MVC设计模式

http://www.yesky.com/374/1802374.shtml 通过Java Swing看透MVC设计模式 2004-05-28 14:50 作者:vipcowrie编译 出处:Matrix 责任编辑:方舟   一个好的用户界面(GUI)的设计通常可以在现实世界找到相应的表现。例如,如果...

topinking的专栏 174

Understanding Swing’s Model

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

topinking的专栏 167

Swing table

http://www.iteye.com/topic/80270 http://blog.sina.com.cn/s/blog_4b6047bc0100073l.html

topinking的专栏 143

MVC模式

http://www.itisedu.com/phrase/200604231324325.html    MVC模式 是"Model-View-Controller"的缩写,中文翻译为"模式 -视图 -控制器"。MVC 应用程序 总是由这三个部分组成。Event(事件)导致Controller改变Model或View,或者同时改变两者。只要Controller改变了Models的数据或者属...

topinking的专栏 127
上一篇: Swing框架之Component:续文二
下一篇: Swing框架之Model之一
topinking
博客等级 码龄20年 15粉丝 242原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值