`
eneve520
  • 浏览: 56479 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

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://s10.sinaimg.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结构并不是低性能的根源,它是构建可扩展程序的关键。

矢量组件

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

http://s16.sinaimg.cn/orignal/4b6047bc7bafae10221ef

渲染器(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渲染器与编辑器用法示例

    Java Swing中JTable渲染器与编辑器用法示例 Java Swing中JTable渲染器与编辑器用法示例是Java Swing中一个重要的组件,主要用于显示和编辑表格数据。在Java Swing中,JTable是最基本的表格组件,渲染器和编辑器是...

    Java Swing数据模型

    - 当用户与组件交互时,模型数据会改变。模型通过触发事件来通知相关的监听器,比如`PropertyChangeListeners`。 - 组件自身监听其模型的变化,并将事件传递给注册的监听器。UI代表(即组件的外观)通常也会监听...

    最全面的swing文本编辑器

    Swing 组件基于 Java 事件模型,支持模型-视图-控制器(MVC)设计模式,使得开发人员能够更容易地管理和更新用户界面。 2. **JPanel** 在这个文本编辑器中,`JPanel` 是一个关键组件,用于承载其他组件或自定义...

    java swing实现pdf阅读器

    在Java Swing中实现PDF阅读器是一项技术挑战,涉及到对PDF文件格式的理解、IO操作、Swing组件的使用以及可能的第三方库集成。 PDF(Portable Document Format)是一种广泛使用的文件格式,用于存储文档,包括文本...

    java-swing版代码生成器

    5. **数据绑定**:对于需要与模型数据交互的组件,如JTable,代码生成器可以自动创建数据模型并进行数据绑定。 6. **导出与导入**:用户可以保存设计的UI为项目文件,方便以后复用或在团队间共享。 7. **自定义...

    JFC/Swing数据模型指代?象集架?的?点及方法

    ### JFC/Swing 数据模型与对象集合架构的关键知识点 #### 标题理解:JFC/Swing数据模型指代对象集架构的特点及方法 - **JFC/Swing**:Java Foundation Classes/Swing,Java基础类库的一个子集,主要用于提供丰富的...

    Swing Datepicker时间选择器jar包

    Swing Datepicker时间选择器是一个在Java Swing库中用于处理日期选择的组件,它提供了用户友好的界面,允许用户在应用程序中方便地选取日期。在Java编程中,Swing库是一个丰富的图形用户界面(GUI)工具包,它是Java ...

    Swing控件,多选下拉框

    创建一个多选下拉框在Swing中需要对组件模型、渲染器和事件处理有深入理解。虽然这可能比创建单选下拉框复杂,但通过自定义或使用第三方库,你可以轻松实现这一功能。对于更复杂的需求,如分组、搜索等功能,可能...

    swing的太阳系轨迹模型

    "swing的太阳系轨迹模型"是利用Swing库来模拟太阳系中行星围绕太阳运动的场景。这个项目不仅展示了Swing的基本用法,还融入了物理学中的天体运动规律。 首先,我们需要了解Swing中的主要组件。在这个模型中,可能会...

    Swing线程的最后讨论 -- 利用异步模型

    动态树采用了分裂模型设计,其中真正的(可能是远程的)模型与本地的同步模型相结合。本地模型作为一个快照,用于快速响应用户的交互,而远程模型在需要时被更新。这种方法适用于静态的远程数据,但需要处理两个模型...

    javaswing酒店管理系统源代码+数据库模型

    javaswing酒店管理系统源代码+数据库模型 酒店管理系统的需求包括开台点菜功能、智能化获取菜品功能、自动结账功能、营业额报表功能等。依据餐饮行业的特点,本系统实现以下目标: 操作简单方便、界面简洁大方。 ...

    Swing文本编辑器

    在这个"Swing文本编辑器"项目中,我们将会探讨如何使用Swing来开发一个基本的文本编辑器。 Swing文本编辑器的核心组件是`JTextArea`,这是一个可以显示和编辑多行文本的组件。我们可以使用`JScrollPane`来包裹`...

    swing教程 swing教程

    Swing 采用了一种 MVC 的设计范式,即"模型-视图-控制"(Model-View-Controller),其中模型用来保存内容,视图用来显示内容,控制器用来控制用户输入。 Swing 的外观感觉 Swing 采用了一种可插入的外观感觉...

    swing随即抽号器

    swing随即抽号器,使用了lookAndFeel

    java Swing 多线程下载器

    此外,GUI也需要实时更新以反映下载进度,这可以通过使用Swing的事件驱动模型和模型-视图-控制器(MVC)设计模式来实现。 在实际编码中,可能会用到以下Java类和接口: 1. `javax.swing.JFrame`:作为主窗口。 2. `...

    Swing实现编辑器(支持语法高亮)

    Swing提供了一系列组件,用于创建丰富的桌面应用程序,包括按钮、文本框、表格、菜单等,以及复杂的布局管理器。 在Swing中实现一个编辑器,首先需要理解Swing的基础组件,如JFrame、JPanel和JTextComponent系列。...

    Java Swing登录资源管理器

    4. **事件监听**:Swing的模型-视图-控制器(MVC)架构使得开发者能通过添加事件监听器来响应用户的操作,例如点击“添加”按钮时触发添加新登录信息的逻辑,或者选择一条记录后显示详细信息。 5. **对话框**:在...

    javaswing图书馆管理系统源代码+数据库模型

    javaswing图书馆管理系统源代码+数据库模型 确保系统具有良好的系统性能,友好的用户界面。 较高的处理效率,便于使用和维护。 采用成熟技术开发,使系统具有较高的技术水平和较长的生命周期。 系统尽可能...

    swing版代码生成器1.2

    【Swing版代码生成器1.2】是一款基于Java Swing技术开发的代码自动化工具,它旨在简化软件开发过程,提高开发效率。Swing是Java提供的一种用于构建图形用户界面(GUI)的库,其组件丰富,灵活性高,使得开发者能够...

Global site tag (gtag.js) - Google Analytics