Swing模型和渲染器

开发 后端
本文介绍可以通过操作Swing模型和渲染器来控制这个过程,所有的矢量组件,包括JTree、JList以及JComboBox都使用渲染器方法,并不仅限于JTable。

Swing模型和渲染器

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

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

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

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

模型(Model)

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

这些代码只是简单的往JComboBox中添加数据项,代码同往AWT的Choice中添加选项类似,这种方法对于小数据量来说可以,但是当要添加大量数据时就会明显变得非常慢。

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

这样为什么会更快呢?原因有两个。***,因为所有项是一次添加到模型去,而不是一个一个的,只有一个事件发出,这意味着更少的事件触发,更少的方法调用。第二是因为需要通知变化的对象更少,总的工作量等于触发次数乘以侦听器数目。因为模型是新创建的,侦听在上面的侦听器为零,这意味着没有触发事件发生。

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

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

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

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

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

【编辑推荐】

  1. 浅谈学习Swing组件
  2. Swing使用invokeLater()方法
  3. 浅析Swing组件的规则
  4. 详解Swing中JTree组件的功能
  5. 简单介绍Swing外观
责任编辑:佚名 来源: 电子工业出版社
相关推荐

2009-07-16 10:26:49

渲染器接口Swing

2009-07-16 10:11:06

渲染器RendererSwing组件

2010-08-13 11:02:27

Flex渲染器

2014-06-18 10:34:41

Android字体渲染器OpenGL ES

2017-12-26 14:27:24

2010-08-13 11:21:31

Flex渲染器

2012-01-17 17:21:24

JavaSwing

2022-04-18 08:09:44

渲染器DOM挂载Vue.js

2009-06-22 13:27:01

JSF组件模型

2010-06-30 13:45:05

ZKZK 5.0.3

2009-07-09 11:55:17

Swing模型过滤

2022-04-20 09:07:04

Vue.js的事件处理

2009-07-15 15:35:59

Swing程序Swing性能

2022-04-19 23:01:54

Vue.jsDOM节点DOM树

2009-07-14 11:30:15

Swing线程

2009-07-14 09:09:08

Swing模型过滤器

2022-08-14 23:04:54

React前端框架

2013-07-10 10:24:10

2013-11-20 10:47:57

浏览器渲染html

2024-01-29 00:51:39

前端开发利器
点赞
收藏

51CTO技术栈公众号