`

java中的模型与渲染器

    博客分类:
  • java
阅读更多
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)概念。


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

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

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

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

触发事件数量严重影响你的程序启动时间,也会影响打开对话框和相似操作的时间。
分享到:
评论
1 楼 lliiqiang 2011-01-12  
有时可怕的是好的东西,由于人的不会使用,反而起到襄樊的效果

相关推荐

    obj模型,java3d加载

    7. **渲染模型**:最后,将Scene Graph添加到`Universe`或`BranchGroup`中,并启动Java3D的渲染循环,模型就会在屏幕上显示出来。 在实际应用中,可能还需要处理光照、摄像机位置、动画等高级特性。Java3D提供了...

    Java的MVC模型案例

    在Java中,模型通常由一组Java类组成,这些类与数据库或其他数据源交互,获取和存储数据。模型对象并不直接与用户界面交互,而是通过控制器传递信息。在这个案例中,我们可能会看到一些名为`UserModel`、`Product...

    java版软3D渲染器

    只使用一个画点函数,从零实现一个3D渲染器,主要是用于学习使用。代码2000行左右。使用pgup、pgdn、←、↑、→、↓、或z、x、a、s、q、w键可以向左向右向上向下或旋转3D模型。上传到这主要是为了以后下载,不会丢。

    Java3D-加载显示3D模型

    在"Java3D-加载显示3D模型"这个主题中,我们将深入探讨如何使用Java3D来加载和渲染3D模型。 首先,3D模型通常是以特定格式存储的数据结构,如.gal或.obj。这里提到的"galleon.obj"文件就是一个3D模型文件,它可能是...

    基于java的VR全景图+Opengl3D模型展示源码

    在这个特定的项目中,我们看到的是Java技术被应用于虚拟现实(VR)领域,结合OpenGL 3D图形库来创建全景图和3D模型的展示。这是一个深入学习和实践Java图形处理、3D建模以及VR技术的好机会。 1. **Java VR全景图**...

    实现obj文件的加载和用鼠标旋转,可从多个角度查看用3d做的模型Java.zip

    在Java编程环境中,加载和展示3D模型是一个常见的任务,特别是在游戏开发、可视化应用和图形设计领域。这里的项目实现了一个功能,即加载OBJ文件并允许用户通过鼠标旋转模型,从而从多个角度查看3D模型。OBJ是一种...

    java 实现太阳系模型

    总的来说,"Java实现的太阳系模型"项目不仅涵盖了编程技术,也涉及了物理知识,是学习Java编程、图形渲染和物理原理的一个很好的实践项目。通过这个项目,开发者可以提升解决问题、设计复杂系统和理解现实世界现象的...

    Phone光照模型gui,java

    在3D图形渲染中,光照模型决定了物体表面看起来是亮还是暗,以及它们的颜色是如何变化的。GUI(图形用户界面)则是人与计算机交互的主要方式,通过图标、按钮等可视化元素使得操作更加直观。Java是一种广泛使用的...

    java3D动画制作教程

    7. **渲染与显示**:最后,将`SceneGraph`添加到视口(`Canvas3D`)中,使用`View`来控制视图参数,如视角、焦距等,然后启动渲染循环以显示三维场景。 在编写Java 3D程序时,理解`SceneGraph`的工作原理和如何有效...

    java图片生成器

    在Java中实现图片生成器涉及到对Java 2D API、AWT和Swing库的深入理解。 Java 2D API是Java平台的标准部分,提供了丰富的功能来处理二维图形和图像。它支持基本的绘图操作,如绘制线、形状、文本和位图。开发者可以...

    JAVA飞机大战模型和程序代码

    【JAVA飞机大战模型和程序代码】是一个非常适合Java初学者学习的项目,它涵盖了游戏开发的基础概念和编程技术。在这个项目中,你可以了解到如何利用Java语言来实现一个动态、交互式的飞行射击游戏。以下是对这个项目...

    用Java制作属性编辑器

    同时,通过`Hashtable`对象存储属性编辑器和渲染器,根据属性名动态获取对应的编辑器和渲染器,以实现不同的编辑和显示效果。 属性编辑器还需要提供接口来处理只读属性以及属性值改变的通知机制。例如,可以定义一...

    JAVA WEB中MVC设计模式

    在Java Web应用中,视图通常由JSP、HTML、CSS和JavaScript组成,用于渲染模型中的数据并呈现给用户。 - 视图并不直接操作模型,而是通过控制器获取模型数据,只负责显示。 3. **控制器(Controller)**: - 控制...

    java代码生成器

    3. **渲染过程**:FreeMarker引擎将模板和数据模型结合,依据模板中的指令处理数据模型,生成最终的代码字符串。 使用FreeMarker和其他代码生成器的优点包括: - **提高生产力**:通过自动化生成常见和重复的代码,...

    objTo3dtiles(Java).rar

    Cesium提供了丰富的API和工具,用于加载、渲染和操作3D地形、建筑物、飞行器等元素。 【Java实现】本工具选择用Java来实现,是因为Java具有跨平台的特性,且有强大的库支持,可以方便地处理文件I/O和复杂的几何计算...

    在Java_3D中载入外部3D模型文件.doc

    加载模型后,可能会发现模型在Java 3D中的显示与3D建模工具中的视角不同。这是因为Java 3D采用的坐标系统(屏幕宽度对应X轴,高度对应Y轴,屏幕朝向用户的方向为Z轴正方向)与大多数3D建模工具的世界坐标系有所不同...

    Prime:纯Java编写的逼真的渲染器,具有在OpenGL和Swing中完成的UI

    Prime是基于物理的渲染器,基于具有JOGL绑定的纯Java构建,具有: 蒙特卡洛路径跟踪。 光子映射。 可自定义的材质和渲染管道。 将添加以下功能:1.网络分布式渲染。 2.纹理贴图和法线贴图。 怎么跑 确保已经...

    Java游戏中斜视角编辑器及引擎源代码

    【Java游戏开发中的斜视角编辑器与引擎源代码解析】 在Java游戏开发中,斜视角(也称为45度视角或等轴投影)是一种常见的视觉表现手法,它为玩家提供了比正交视角更广阔的视野,同时又保留了比3D视角更简单的图形...

    在Java的下拉列表中使用图标功能.rar

    3. 创建一个自定义渲染器,用于在列表中显示图标和文本。 4. 将渲染器设置给JComboBox。 以上就是使用Java在下拉列表中添加图标功能的详细步骤。通过这种方式,你可以创建更加生动和直观的用户界面。在实际开发中,...

Global site tag (gtag.js) - Google Analytics