Swing模型与渲染器

关键字: swing

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


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

Java 基础类(JFC)Swing工具提供了使用Java平台创建高度可交互性图形用户界面的类。Swing是高度灵活的,但是也因此相当复杂,虽然新手能够使 用Swing创建基本的图形用户界面(GUI),但是真要创建一个复杂、专业的GUI界面,你必须理解Swing的体系架构的基础,尤其是使用 Swing创建复杂、像JTable、JTree、JComboBox以及JList这样基于渲染器的组件,Swing提供的基于模型和渲染器的组件是构 建高性能、可扩展GUI的关键。

Swing体系结构

最初Smalltalk系统的UI工具使用所谓的模型-视图-控制(MVC)模式,MVC引入这样一个概念:数据源应该同屏幕展现分开。这是一个优秀的体系设计结构,能促进代码重用和程序框架。Swing使用的是一个变体的MVC架构,如图所示:

http://static10.photo.sina.com.cn/orignal/4b6047bc27d7398808689



典 型的Swing GUI组件包括至少三个对象:一个Component,一个Model和一个UI Delegate,在这个框架中,Model负责存储数据,UI Delegate负责从Model获取数据并渲染到屏幕上去,Component通常协调Model和Delegate之间的操作,并同时负责将 Swing嵌入到AWT窗口系统中。

注意,UI Delegate对象可以在运行的时候动态替换,这就使Swing具备了可插拔的外观(Pluggable Look-And-Feel, PLAF)。

虽 然Swing的MVC结构显然具备灵活性的好处,但是这个结构通常被指责为一些程序慢的根源。虽然基于MVC结构需要更多的方法调用来支持额外的重定向, 其实花费在这儿的消耗很小。对基于Swing的应用程序profile的结果显示,model-view分隔的开销可以忽略不计,不到CPU总开销的 1%,复杂的Swing用户界面的多数处理事件其实都花费在了底层的图形操作上了。Swing的model-view结构并不是低性能的根源,它是构建可 扩展程序的关键。

矢量组件
http://static16.photo.sina.com.cn/orignal/4b6047bc7bafae10221ef

Swing 提供了一些处理大数据量数据集的组件,包括JTable、JTree、JList以及JComboBox。这些矢量组件被设计成能够处理成千上万甚至数百 万的数据,为了避免占用大量内存,这些组件在Swing的体系架构增加了渲染器(renderer)概念。下图是增加了渲染器结构的Swing 体系架构。



渲染器(Renderer)

在这些更为复杂的Swing组件中,渲染器是提供可扩展性 的关键。我们以JTable作为渲染器的示例。缺省表格中的每一格可能都有一个JLabel,这对于比较小的数据集来说可行,但是对于大数据集就行不通。 比如,如果使用这种表格显示1000x1000的数据集,需要的内存可能要1G,即使每个格子都是空的。

如果解决这种扩展性问题?Swing的JTable使用一个组件来画出所有相同类型的格子。比如所有的String对象的格子都使用相同的组件画。这种类型的组件被称作渲染器(renderer),使用渲染器显示多个表格极大的减小了大型数据表存储空间。

当渲染器用来显示表格时,JTable从model中获取格子中的数据,然后使用这些数据对渲染器进行配置,然后使用该渲染器画出该格子。接下来,渲染器继续移动到下一个格子,然后重复这个过程。


注意你可以通过操作渲染器和模型来控制这个过程,所有的矢量组件,包括JTree、JList以及JComboBox都使用渲染器方法,并不仅限于JTable。

模型(Model)

直接操作Swing的模型(Model)对于编写可扩展的用户界面至关重要,下面代码是往JComboBox添加数据项的通常做法:

JComboBox box = new JComboBox();
for (int i = 0; i < numItems; i++) {
box.addItem(new Integer(i));
}
这些代码只是简单的往JComboBox中添加数据项,代码同往AWT的Choice中添加选项类似,这种方法对于小数据量来说可以,但是当要添加大量数据时就会明显变得非常慢。

尽 管上面的代码没有明确引用任何模型,JComboBox的模型对象实际上参与这个过程,每次调用addItem时,JComboBox内部发生了许多操 作:组件将请求传递给JComboBox的模型,模型发送一个事件表明一个新项被添加。很明显,如果你直接操作模型的将会更高效,如下例所示:

Vector v = new Vector(numItems);
for (int i = 0; i < numItems; i++) {
v.add(new Integer(i));
}
ComboBoxModel model = new DefaultComboBoxModel(v);
JComboBox box = new JComboBox(model);
这 样为什么会更快呢?原因有两个。第一,因为所有项是一次添加到模型去,而不是一个一个的,只有一个事件发出,这意味着更少的事件触发,更少的方法调用。第 二是因为需要通知变化的对象更少,总的工作量等于触发次数乘以侦听器数目。因为模型是新创建的,侦听在上面的侦听器为零,这意味着没有触发事件发生。

从上面的例子可以学到两点:

尽可能使用批操作,尽量减少触发事件的数量。

当初始化或者需要完全替换模型的内容时,考虑重新生成模型,不要使用已经存在的模型,已存在模型上已经保持了很多的侦听器,新生成的模型没有侦听器,这样避免了不必要的处理函数的调用。

触发事件数量严重影响你的程序启动时间,也会影响打开对话框和相似操作的时间。

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

本想详细举几个例子进一步说明模型和渲染器的用法和好处,但网络速度还是太慢,写一篇文章太痛苦了...加上篇幅原因,准备以后再写一文,弥补这方面的知识。

以后几篇文章包括(非文章标题):

使用Swing模型和渲染器优化Swing程序。

Swing/AWT事件处理模型以及线程安全。

如何编写响应快速的Swing程序。

SWT设计和实现介绍。

JNI与Java性能的关系。

垃圾收集与虚拟机与Java性能。

Swing与SWT性能比较(前面所有的文章都和这篇有关,是基础)。

 

 

 

 

 

 

 

 

 

 

【Java】高级Swing——JTable 相比JList,JTable显然要复杂很多。JTabel同样继承了java一贯的设计风格,将数据模型与表格的绘制分离。即有默认的样式,也提供了很多接口。这不仅使Java的表格设计思路清晰,而且几乎所有的个性化需要也可以得到满足。 缺点是:Java库中封装了过多的方法,为了使其尽可能通俗易懂,方法名和常量名非常长,这让Java代码看起来十分啰嗦,并不优美。但这在强大的IDE中可以用代码提示功能解决。 1.根据构造放发创建JTabel;可以传表的内容(二位数组),和表头(一维数组) 下面是我校的小图丁志愿者录取 阅读详情

相关推荐

36、Java GUI编程:Swing可分离模型架构与自定义渲染器

本文深入探讨了Java Swing的可分离模型架构及其优势,通过示例程序展示了JList与ListModel的使用方法。文章还详细介绍了如何编写自定义渲染器,以实现更灵活的界面展示效果,并解决了复选框不可操作的问题。最后,总结了关键知识点并提供了扩展应用思路,帮助开发者更好地掌握Swing组件的使用。

nut55的博客 58

推荐系统笔记--Swing模型的原理

重叠度大代表两个人可能来自同一个小圈子,那么他们对相似度的贡献会比较小。重叠度小,说明他们可能不属于同一个小圈子,则他们对相似度的贡献比较大,使用 overlap(u1, u2) 可以降低小圈子对相似度的影响,alpha是个人工设置的参数,用来防止分母为 0 的情况;在 Item CF 召回中,物品的相似度是基于其。时,就会误将两个不相似的物品定义为相似;Swing 模型引入。来衡量的,但当受众的交集局限在一个。来判断两个用户是否属于一个小圈子;1--Swing模型的引入。1--Swing模型的引入。

牵一只蜗牛去散步 1324

探索Swing组件的可分离模型架构与自定义渲染器

本篇博客文章深入探讨了Swing中JList组件的可分离模型架构及其自定义渲染器的应用。通过实际案例,展示了如何利用ListModel接口实现数据与视图的分离,保证多个视图组件间的数据同步,并且讲解了如何通过自定义渲染器来改变组件的显示方式,以适应不同的交互需求。

weixin_35757531的博客 296

Swing模型

Swing与ItemCF很相似,只有判断物品相似的方法不一样。Swing给用户设置权重,解决小圈子问题。

zhouwenxing666的博客 528

Java Swing中JTable渲染器与编辑器用法示例

主要介绍了Java Swing中JTable渲染器与编辑器用法,结合实例形式较为详细的分析了Swing中JTable渲染器与编辑器的功能、使用方法及相关注意事项,需要的朋友可以参考下

如何用 OBProxy 实现 OceanBase 的最佳路由策略

本文基于业务中一类常见的路由问题展开,对OceanBase的路由功能及对应配置项做详细介绍,指导用户在业务实践中如何正确的配置路由策略及快速排查路由问题

OceanBase分布式数据库的博客 1680

java swing 组件渲染过程,swing组件介绍

学习swing组件,主要有三个内容一是组件的显示,二是对组件支持的事件进行侦听,三是是自定义组件1.JFrameJFrame是主窗口,它和JDialog,JApplet的地位并列.但是,一个JFrame可以添加JDialog和JApplet进去它的内容面板,而反过来就不行下面来看JFrame的例子=================================================pa...

weixin_35403151的博客 618

Python实战:用SkillMetrics库5分钟搞定泰勒图绘制(附完整代码)

本文详细介绍了如何使用Python的SkillMetrics库快速绘制专业泰勒图,以直观对比多个模型的预测性能。通过整合相关系数、标准差和中心化均方根误差三个核心指标,该工具能帮助数据科学家和研究者高效完成模型评估与可视化,提升分析报告质量。文章提供了从环境配置、数据准备到高级定制与子图对比的完整代码示例。

7z8x2c4v6b9的博客 371

Swing模型与渲染器(转载)

转载自[url]http://blog.sina.com.cn/swingjava[/url] Java基础类(JFC)Swing工具提供了使用Java平台创建高度可交互性图形用户界面的类。Swing是高度灵活的,但是也因此相当复杂,虽然新手能够使用Swing创建基本的图形用户界面(GUI),但是真要创建一个复杂、专业的GUI界面,你必须理解Swing的体系架构的基础,尤其是使用 S...

来杯咖啡,随便聊聊。 158

openMVS ---dense point cloud(代码理解)

openMVS ---dense point cloud(代码理解)0 代码实现原理1 代码实现步骤1.1 参数传递1.2 loading .mvs数据1.3 稠密重建1.3.0 相关变量及概念1.3.1 ComputeDepthMaps(data) --计算多张深度图1.3.1.1. pre1.3.1.2 为每一张depth map Select view(s) !!!1.3.1.2.1 N neighbors --- global score + filter1.3.1.2.2 MRF ---- t

小rivaaaa的博客 5328

VMware Workstation Pro必备技巧:5分钟搞定Ubuntu虚拟机磁盘瘦身(附常见错误解决)

本文详细介绍了如何为VMware Workstation Pro中的Ubuntu虚拟机进行磁盘瘦身,解决.vmdk文件只增不减的问题。通过清理系统垃圾、使用零填充空闲空间,并利用vmware-toolbox-cmd或vmware-vdiskmanager工具进行压缩,可有效回收被无效占用的磁盘空间。文章还提供了常见错误解决方案和预防性维护建议,帮助用户高效管理虚拟机存储。

sea99的博客 296

Swing学习笔记之模型与渲染器

http://blog.sina.com.cn/s/blog_4b6047bc010007j3.html Java基础类(JFC)Swing工具提供了使用Java平台创建高度可交互性图形用户界面的类。Swing是高度灵活的,但是也因此相当复杂,虽然新手能够使用Swing创建基本的图形用户界面(GUI),但是真要创建一个复杂、专业的GUI界面,你必须理解Swing的体系架构的...

精致-简洁-唯美 158

linux 内核vxlan收发包流程

1.vxlan口收包处理流程 前面几章详细介绍了vxlan接口的使用,而且已经知道vxlan是 MAC IN UDP中的封装,因此,在解封装之前,一切按照原有流程走,在此复习一下内核收发包流程(驱动层的数据处理这次不再解析,直接从__netif_receive_skb_core开始) #物理网卡处理中断,触发softirq i40e_intr └─napi_schedule_irqoff #i40e softirq把包放到per cpu backlog,触发softirq i40e_napi_p

魏言华的博客 3826

java中的模型与渲染器

Java 基础类(JFC)Swing工具提供了使用Java平台创建高度可交互性图形用户界面的类。Swing是高度灵活的,但是也因此相当复杂,虽然新手能够使用Swing创建基本的图形用户界面(GUI),但是真要创建一个复杂、专业的GUI界面,你必须理解Swing的体系架构的基础,尤其是使用 Swing创建复杂、像JTable、JTree、JComboBox以及JList这样基于渲染器的组件,Swin...

mxdxm8899的专栏 174

从零构建:四轴机械臂D-H参数建模与MATLAB实战指南

本文详细介绍了四轴机械臂D-H参数建模的完整流程与MATLAB实战应用。从机械臂运动学基础出发,解析D-H参数原理与坐标系建立规则,提供MATLAB Robotics Toolbox的安装、模型创建及正逆运动学求解的代码实现。特别针对四轴机械臂的逆运算优化、轨迹规划和奇异位形规避等高级应用给出实用解决方案,是机器人开发者的实战指南。

weixin_29062255的博客 419

R语言使用mlr包创建回归任务、指定回归学习函数为KNN回归模型、网格搜索、交叉验证调节KNN模型的超参数K获取模型最佳的K值、可视化KNN模型的不同K值和MSE指标之间关系图

R语言使用mlr包创建回归任务、指定回归学习函数为KNN回归模型、网格搜索、交叉验证调节KNN模型的超参数K获取模型最佳的K值、可视化KNN模型的不同K值和MSE指标之间关系图

statistics+insight+vista+power 279

Java中的模型与渲染器

Java 基础类(JFC)Swing工具提供了使用Java平台创建高度可交互性图形用户界面的类。Swing是高度灵活的,但是也因此相当复杂,固然新手能够使用Swing创建基本的图形用户界面(GUI),但是真要创建一个复杂、专业的GUI界面,你必须理解Swing的体系架构的基础,尤其是使用 Swing创建复杂、像JTable、JTree、JComboBox以及JList这样基于...

weixin_33923148的博客 270

自适应控制 (Adaptive Control) 算法详解及案例分析

自适应控制是一种能够在线调整控制器参数以适应系统动态变化的控制方法。其核心思想是通过实时估计系统参数或调整控制器参数,使系统在不确定性或动态变化的环境中仍能保持稳定性和性能。

闲人编程的博客 4084

Swing开发之JComboBox篇

JList和ComboBox很相似,因为这两个组件都显示一个项列表。因此,它们都有扩展ListModel接口的模型。而且,这两个组件都有绘制器,这些绘制器通过实现ListCellBender

wangchaoqi1985的博客 859

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【swing】关于swing里面的jlist的绑定,美化,获取选中项等

【前言】 我再次捡起swing,因为跨平台,低成本---并非说开发成本,而是说配套使用的服务器,数据库,开发工具等成本,这方面微软是力有不及。 然后搞了一个代码生成器的界面----假如您看了前面的文章的话,您一定会对代码生成器这个词语非常熟悉,对,我就是在各种平台各个语言下面不停造轮子,不停搞代码生成器。 【JLIst】 因为需要显示常用的数据库连接给用户进行选择,并且需要改一改样

一名普通码农的菜地 5479

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

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

Java swing系列之JList类(4)

JList方法集锦: public ListUI getUI() 返回呈现此组件的外观对象 ListUI。 public void setUI(ListUI ui) 设置呈现此组件的外观对象 ListUI。 public void updateUI() 重置 ListUI 属性,将其设置为当前外观所提供的值。如果当前单元渲染器由开发人员(而不是外观本身)安装,则这还会导致单

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值