关键字: 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架构,如图所示:
典
型的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结构并不是低性能的根源,它是构建可
扩展程序的关键。
矢量组件
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性能比较(前面所有的文章都和这篇有关,是基础)。
分享到:
相关推荐
创建一个多选下拉框在Swing中需要对组件模型、渲染器和事件处理有深入理解。虽然这可能比创建单选下拉框复杂,但通过自定义或使用第三方库,你可以轻松实现这一功能。对于更复杂的需求,如分组、搜索等功能,可能...
7. **模型-视图-控制器(MVC)**:Swing的设计遵循MVC模式,使得代码结构清晰,易于维护。例如,JTable组件就包含了TableModel、TableColumnModel和TableUI三个部分,分别对应数据模型、列模型和视图界面。 8. **...
这个类可以用来协调UI、渲染器和数据模型之间的通信,确保它们在处理合并单元格时保持一致。 为了实现单元格合并,你需要理解Swing组件模型、事件处理和UI委托系统。以下是一些关键步骤: 1. 创建自定义的`TableUI...
5. **可定制性**:Swing组件允许深度定制,例如,可以自定义渲染器(CellRenderer)和编辑器(CellEditor)来改变组件的外观和行为,或者使用LookAndFeel来更改整个应用的视觉样式。 6. **国际化支持**:Swing API...
JTable支持自定义列模型和渲染器,而JTree则可以用来表示层次结构的数据。 8. **国际化与本地化**:Swing支持多语言应用,通过ResourceBundle和Locale对象,开发者可以轻松地为不同地区提供本地化的界面。 通过...
此外,还可以自定义组件的渲染器和编辑器,以实现更复杂的数据展示和编辑功能。 为了提高程序的性能,Swing使用轻量级组件模型,这意味着它们大部分运行在Java虚拟机中,而不是依赖于操作系统。然而,这同时也意味...
10. **可定制性**:Swing组件允许自定义外观和行为,例如通过设置渲染器(Renderer)和编辑器(Editor)来改变JTable或JComboBox的表现。 这个压缩包中的"高级Swing讲义及代码"可能涵盖了这些主题,并通过具体的...
这些案例可能会展示如何自定义这些组件的行为和外观,比如自定义列渲染器和编辑器。 7. **国际化和可访问性**: Swing支持应用程序的国际化和无障碍访问,这对于创建面向全球用户的软件至关重要。案例可能包含如何...
7. **JTable和JTree**:使用JTable展示表格数据,JTree展示树形结构数据,学习如何自定义模型和渲染器以满足特定需求。 8. **Swingworker**:当需要进行耗时操作时,使用Swingworker来避免阻塞UI线程,确保用户界面...
在Swing的JTable中,每个单元格可以有不同的编辑器和渲染器,允许用户以特定方式显示和编辑数据。TableEditor通常是一个实现了CellEditor接口的类,它定义了如何启动和停止编辑,以及如何获取和设置单元格的值。这样...
5. **高级组件**:讲解JTable、JTree、JList等高级组件的使用,如何展示数据、进行数据操作,以及自定义渲染器。 6. **对话框和菜单**:涵盖JOptionPane的使用,用于创建简单的对话框,以及JMenu、JMenuItem的使用...
例如,JTable组件就使用了此模式,允许开发者分别定义表格的数据模型、列头和行渲染器。 6. **国际化支持** Swing内置了对多语言的支持,通过ResourceBundle类可以轻松地切换不同语言的资源文件,实现应用程序的...
渲染器是决定组件如何显示元素的类,我们需要重写`paintComponent()`方法,以便在下拉框中显示已选中的多个选项。 3. **Custom Model**:JComboBox的模型(DefaultComboBoxModel)需要扩展以支持多选。这可能涉及到...
JTable由三部分组成:模型(TableModel)、视图(TableColumnModel)和渲染器(Renderer)。TableModel负责存储和管理数据,TableColumnModel管理列的属性,如宽度、位置等,渲染器则决定如何将数据呈现给用户。 ...
视图是用户与之交互的界面,它负责展示模型的状态给用户,并且能够从模型中获取信息来渲染界面。控制器则作为模型和视图之间的中介,接收用户输入并将这些输入转换为对模型的操作。 其次,MVC模式的优点是数据逻辑...
Prime是基于物理的渲染器,基于具有JOGL绑定的纯Java构建,具有: 蒙特卡洛路径跟踪。 光子映射。 可自定义的材质和渲染管道。 将添加以下功能:1.网络分布式渲染。 2.纹理贴图和法线贴图。 怎么跑 确保已经...
另外,Swing使用Java2D绘图技术,使得图形渲染更高效,支持复杂的动画效果。 八、Swing应用程序的打包与部署 通过Java Web Start(JWS)或JavaFX Packager,开发者可以将Swing应用打包为可执行的JAR文件或应用程序...
在Swing中,表头由JTableHeader类表示,我们可以创建一个继承自DefaultTableHeaderCellRenderer的自定义渲染器来实现表头合并。表头合并通常涉及到两个主要步骤:绘制合并的单元格和调整列宽以适应合并后的表头。 1...
3. **模型-视图-控制器(MVC)模式**: Swing 遵循MVC设计模式,组件有自己的模型(Model)来存储数据,视图(View)显示数据,控制器(Controller)处理用户交互。这种分离使得代码更易于理解和维护。 4. **事件...
- **自定义组合框模型**:介绍了如何构建自定义的组合框模型和单元格渲染器,以及如何向默认的组合框编辑器添加功能。 - **序列化组合框模型**:还探讨了如何序列化组合框模型以便于以后使用。 ##### 第十章:列表...