`
androider
  • 浏览: 752240 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

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

阅读更多
http://blog.sina.com.cn/s/blog_4b6047bc010007j3.html

         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);


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

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

    *      尽可能使用批操作,尽量减少触发事件的数量。
    *      当初始化或者需要完全替换模型的内容时,考虑重新生成模型,不要使用已经存在的模型,已存在模型上已经保持了很多的侦听器,新生成的模型没有侦听器,这样避免了不必要的处理函数的调用。

             触发事件数量严重影响你的程序启动时间,也会影响打开对话框和相似操作的时间。
  • 大小: 4.2 KB
  • 大小: 5.3 KB
分享到:
评论

相关推荐

    Swing学习系列 -- Swing读书笔记目录

    这篇Swing读书笔记目录旨在帮助开发者更好地理解和掌握Swing的相关知识,通过阅读和学习,可以提升在Java GUI编程上的技能。 首先,Swing是Java Foundation Classes (JFC)的一部分,它是Sun Microsystems为Java平台...

    java学习笔记之一Swing

    ### Java Swing 学习笔记详解 #### 一、引言 在Java图形用户界面(GUI)编程领域,Swing 是一个强大的工具包,用于构建功能丰富且美观的应用程序界面。与早期的 AWT(Abstract Window Toolkit)相比,Swing 提供了...

    Java swing 知识总结学习笔记

    ### Java Swing 知识总结学习笔记 #### 一、Swing 概述 Swing 是一个用于构建桌面应用程序的 Java 图形用户界面 (GUI) 工具包,它基于 Java Abstract Window Toolkit (AWT) 构建而成。Swing 提供了更丰富的组件集...

    Java Swing数据模型

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

    Swing读书笔记

    ### Swing读书笔记:深入理解Swing的包与版面结构 #### Swing的常用包解析 Swing作为Java中用于创建图形用户界面(GUI)的主要库,提供了丰富的组件和功能,其核心包及其作用如下: 1. **`javax.swing`**: - 这是...

    java swing 学习资料

    此外,Swing 还支持模型-视图-控制器(MVC)设计模式,使得开发者可以将界面逻辑与数据逻辑分离。例如,JTable 和 DefaultTableModel 就是这一概念的体现,开发者可以独立地修改表格的数据模型,而无需关心界面的显示...

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

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

    swing学习

    4. **事件处理(Event Handling)**:Swing使用事件驱动模型,用户与组件的交互会产生事件,例如按钮点击、文本输入等。开发者需要编写监听器来处理这些事件。例如,添加ActionListener到JButton上,当按钮被点击时...

    java swing学习资料

    - Swing使用事件监听器模型来处理用户交互。比如,`ActionListener` 可以监听按钮点击事件,`ItemListener` 可用于监听选择事件等。 - 使用 `addActionListener()`、`addMouseListener()` 等方法为组件添加监听器...

    swing学习心得资料

    在“sinodataLearn”这个文件中,可能包含了关于Swing学习的笔记、代码示例或者练习项目,这些都是深入理解和掌握Swing的好材料。建议逐步研究这些内容,通过实践来加深理论知识的理解,从而提升Swing开发技能。

    java Swing学习之事件与事件处理器模型.pdf

    Swing的事件处理模型基于事件源、事件、事件监听器这一核心概念。事件源,如Component,是产生事件的对象,比如按钮(JButton)、组合框(JComboBox)等。当用户与组件交互时,这些组件会触发相应的事件。 首先,...

    javaSwing学习之事件与事件处理器模型借鉴.pdf

    Java Swing中的事件与事件处理器模型是构建用户界面交互的核心机制。在Swing中,Component类是事件的源头,它可以响应用户的操作,例如鼠标点击、键盘输入等。Swing的事件处理模型采用了一种基于观察者模式的设计,...

    JAVA-Swing学习资料入门级

    5. **模型-视图-控制器(MVC)模式**:Swing 遵循 MVC 设计模式,其中模型(Model)负责数据的存储和处理,视图(View)负责显示,控制器(Controller)负责两者之间的通信。 6. **国际化(Internationalization)*...

    Java 学习笔记Java学习笔记

    Java的学习涵盖了许多方面,包括基础语法、类与对象、异常处理、集合框架、IO流、网络编程、多线程、数据库操作、Swing GUI、JavaFX、框架技术以及JVM优化等。 1. 基础语法:Java的基础语法包括变量声明、数据类型...

    java swing 学习教程

    通过阅读“Java Swing (第二版英文)”这本书,你将获得关于Swing组件、布局、事件处理、模型-视图-控制器架构的全面理解,并能熟练运用这些知识来构建复杂的桌面应用程序。附带的源码可以帮助你更好地理解和实践书中...

    JAVA_Swing 学习经典例子

    11. **Event Handling**: Swing 使用事件监听器模型来处理用户交互。例如,你可以添加ActionListener到按钮,当按钮被点击时执行相应的动作。 12. **SwingUtilities.invokeLater()**: 这个方法用于确保所有的Swing...

    swing的太阳系轨迹模型

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

    swing窗体控件学习文档

    12. **Event Handling**:Swing通过监听器模型处理用户交互事件,例如ActionListener、MouseListener和KeyListener等。你可以为特定的组件添加监听器,以便在特定事件发生时执行相应操作。 13. **LookAndFeel**:...

    SwingHacks学习笔记(2)-----自定义JLabel,JButton

    这篇“SwingHacks学习笔记(2)-----自定义JLabel,JButton”博客文章深入探讨了如何利用Swing自定义组件,特别是JLabel和JButton,以实现更丰富的用户交互。 JLabel是Swing中用于显示文本、图像或两者组合的基本组件...

    java swing深入学习例子

    中级阶段还会涉及模型-视图-控制器(MVC)设计模式,Swing中的许多组件遵循这一模式,如JTable和JList,它们的模型可以独立于视图和控制器进行操作。 **高级篇:自定义组件与高级特性** 在高级阶段,学习如何创建...

Global site tag (gtag.js) - Google Analytics