`

三、GUI篇

阅读更多


  这一部分介绍的内容适合于图形用户界面的应用(Applet和普通应用),要用到AWT或Swing。

  3.1 用JAR压缩类文件

  Java档案文件(JAR文件)是根据JavaBean标准压缩的文件,是发布JavaBean组件的主要方式和推荐方式。JAR档案有助于减少文件体积,缩短下载时间。例如,它有助于Applet提高启动速度。一个JAR文件可以包含一个或者多个相关的Bean以及支持文件,比如图形、声音、HTML 和其他资源。

  要在HTML/JSP文件中指定JAR文件,只需在Applet标记中加入ARCHIVE = "name.jar"声明。

  请参见《使用档案文件提高 applet 的加载速度》。

  3.2 提示Applet装入进程

  你是否看到过使用Applet的网站,注意到在应该运行Applet的地方出现了一个占位符?当Applet的下载时间较长时,会发生什么事情?最大的可能就是用户掉头离去。在这种情况下,显示一个Applet正在下载的信息无疑有助于鼓励用户继续等待。

  下面我们来看看一种具体的实现方法。首先创建一个很小的Applet,该Applet负责在后台下载正式的Applet:

import java.applet.Applet;
import java.applet.AppletStub;
import java.awt.Label;
import java.awt.Graphics;
import java.awt.GridLayout;
public class PreLoader extends Applet implements Runnable, AppletStub {
String largeAppletName;
Label label;
public void init() {
// 要求装载的正式Applet
largeAppletName = getParameter("applet");
// “请稍等”提示信息
label = new Label("请稍等..." + largeAppletName);
add(label);
}
public void run(){
try {
// 获得待装载Applet的类
Class largeAppletClass = Class.forName(largeAppletName);
// 创建待装载Applet的实例
Applet largeApplet = (Applet)largeAppletClass.newInstance();
// 设置该Applet的Stub程序
largeApplet.setStub(this);
// 取消“请稍等”信息
remove(label);
// 设置布局
setLayout(new GridLayout(1, 0));
add(largeApplet);
// 显示正式的Applet
largeApplet.init();
largeApplet.start();
}
catch (Exception ex) {
// 显示错误信息
label.setText("不能装入指定的Applet");
}
// 刷新屏幕
validate();
}
public void appletResize(int width, int height) {
// 把appletResize调用从stub程序传递到Applet
resize(width, height);
}
}
  编译后的代码小于2K,下载速度很快。代码中有几个地方值得注意。首先,PreLoader实现了AppletStub接口。一般地,Applet从调用者判断自己的codebase。在本例中,我们必须调用setStub()告诉Applet到哪里提取这个信息。另一个值得注意的地方是, AppletStub接口包含许多和Applet类一样的方法,但appletResize()方法除外。这里我们把对appletResize()方法的调用传递给了resize()方法。
分享到:
评论
2 楼 huangtut 2008-11-04  
3.6 使用双缓冲区

  在屏幕之外的缓冲区绘图,完成后立即把整个图形显示出来。由于有两个缓冲区,所以程序可以来回切换。这样,我们可以用一个低优先级的线程负责画图,使得程序能够利用空闲的CPU时间执行其他任务。下面的伪代码片断示范了这种技术。

Graphics myGraphics;
Image myOffscreenImage = createImage(size().width, size().height);
Graphics offscreenGraphics = myOffscreenImage.getGraphics();
offscreenGraphics.drawImage(img, 50, 50, this);
myGraphics.drawImage(myOffscreenImage, 0, 0, this);
  3.7 使用BufferedImage

  Java JDK 1.2使用了一个软显示设备,使得文本在不同的平台上看起来相似。为实现这个功能,Java必须直接处理构成文字的像素。由于这种技术要在内存中大量地进行位复制操作,早期的JDK在使用这种技术时性能不佳。为解决这个问题而提出的Java标准实现了一种新的图形类型,即BufferedImage。

  BufferedImage子类描述的图形带有一个可访问的图形数据缓冲区。一个BufferedImage包含一个ColorModel和一组光栅图形数据。这个类一般使用RGB(红、绿、蓝)颜色模型,但也可以处理灰度级图形。它的构造函数很简单,如下所示:
public BufferedImage (int width, int height, int imageType)

  ImageType允许我们指定要缓冲的是什么类型的图形,比如5-位RGB、8-位RGB、灰度级等。

  3.8 使用VolatileImage

  许多硬件平台和它们的操作系统都提供基本的硬件加速支持。例如,硬件加速一般提供矩形填充功能,和利用CPU完成同一任务相比,硬件加速的效率更高。由于硬件加速分离了一部分工作,允许多个工作流并发进行,从而缓解了对CPU和系统总线的压力,使得应用能够运行得更快。利用VolatileImage可以创建硬件加速的图形以及管理图形的内容。由于它直接利用低层平台的能力,性能的改善程度主要取决于系统使用的图形适配器。VolatileImage的内容随时可能丢失,也即它是“不稳定的(volatile)”。因此,在使用图形之前,最好检查一下它的内容是否丢失。VolatileImage有两个能够检查内容是否丢失的方法:

public abstract int validate(GraphicsConfiguration gc);
public abstract Boolean contentsLost();
  每次从VolatileImage对象复制内容或者写入VolatileImage时,应该调用validate()方法。contentsLost()方法告诉我们,自从最后一次validate()调用之后,图形的内容是否丢失。

  虽然VolatileImage是一个抽象类,但不要从它这里派生子类。VolatileImage应该通过 Component.createVolatileImage()或者 GraphicsConfiguration.createCompatibleVolatileImage()方法创建。

  3.9 使用Window Blitting

  进行滚动操作时,所有可见的内容一般都要重画,从而导致大量不必要的重画工作。许多操作系统的图形子系统,包括WIN32 GDI、MacOS和X/Windows,都支持Window Blitting技术。Window Blitting技术直接在屏幕缓冲区中把图形移到新的位置,只重画新出现的区域。要在Swing应用中使用Window Blitting技术,设置方法如下:

setScrollMode(int mode);
  在大多数应用中,使用这种技术能够提高滚动速度。只有在一种情形下,Window Blitting会导致性能降低,即应用在后台进行滚动操作。如果是用户在滚动一个应用,那么它总是在前台,无需担心任何负面影响。
1 楼 huangtut 2008-11-04  
3.3 在画出图形之前预先装入它

  ImageObserver接口可用来接收图形装入的提示信息。ImageObserver接口只有一个方法imageUpdate(),能够用一次repaint()操作在屏幕上画出图形。下面提供了一个例子。

public boolean imageUpdate(Image img, int flags, int x, int y, int w, int h) {
if ((flags & ALLBITS) !=0 {
repaint();
}
else if (flags & (ERROR |ABORT )) != 0) {
error = true;
// 文件没有找到,考虑显示一个占位符
repaint();
}
return (flags & (ALLBITS | ERROR| ABORT)) == 0;
}
  当图形信息可用时,imageUpdate()方法被调用。如果需要进一步更新,该方法返回true;如果所需信息已经得到,该方法返回false。

  3.4 覆盖update方法

  update()方法的默认动作是清除屏幕,然后调用paint()方法。如果使用默认的update()方法,频繁使用图形的应用可能出现显示闪烁现象。要避免在paint()调用之前的屏幕清除操作,只需按照如下方式覆盖update()方法:

public void update(Graphics g) {
paint(g);
}
  更理想的方案是:覆盖update(),只重画屏幕上发生变化的区域,如下所示:

public void update(Graphics g) {
g.clipRect(x, y, w, h);
paint(g);
}
  3.5 延迟重画操作

  对于图形用户界面的应用来说,性能低下的主要原因往往可以归结为重画屏幕的效率低下。当用户改变窗口大小或者滚动一个窗口时,这一点通常可以很明显地观察到。改变窗口大小或者滚动屏幕之类的操作导致重画屏幕事件大量地、快速地生成,甚至超过了相关代码的执行速度。对付这个问题最好的办法是忽略所有“迟到” 的事件。

  建议在这里引入一个数毫秒的时差,即如果我们立即接收到了另一个重画事件,可以停止处理当前事件转而处理最后一个收到的重画事件;否则,我们继续进行当前的重画过程。

  如果事件要启动一项耗时的工作,分离出一个工作线程是一种较好的处理方式;否则,一些部件可能被“冻结”,因为每次只能处理一个事件。下面提供了一个事件处理的简单例子,但经过扩展后它可以用来控制工作线程。

public static void runOnce(String id, final long milliseconds) {
synchronized(e_queue) { // e_queue: 所有事件的集合
if (!e_queue.containsKey(id)) {
e_queue.put(token, new LastOne());
}
}
final LastOne lastOne = (LastOne) e_queue.get(token);
final long time = System.currentTimeMillis(); // 获得当前时间
lastOne.time = time;
(new Thread() {public void run() {
if (milliseconds > 0) {
try {Thread.sleep(milliseconds);} // 暂停线程
catch (Exception ex) {}
}
synchronized(lastOne.running) { // 等待上一事件结束
if (lastOne.time != time) // 只处理最后一个事件
return;
}
}}).start();
}
private static Hashtable e_queue = new Hashtable();
private static class LastOne {
public long time=0;
public Object running = new Object();
}

相关推荐

    原创免费运动检测及测速GUI-GUI生成.zip

    内容详细说明:上篇:GUI制作 1.有两个GUI程序motion_detection.m和MotionDection2010.m,要实现的功能是打开motion_detection.m登录界面,点击其中的enter进入MotionDection2010.m界面进行运动目标检测及测速操作...

    GUI制作的图像处理软件讲义ppt-GUI制作的图像处理软件讲义.ppt

    第三,详细阐述一下图像处理软件平台的制作方法。本文的GUI例子所制作的图像处理软件可以实现的功能有:五种常用的边缘检测、灰度直方图的显示、灰度直方图的均衡化、对比度自适应直方图的均衡化、图片的二值化以及...

    自己写的论文基于GUI的图像处理软件平台的开发-GUI图像处理软件制作详细介绍论文.rar

    自己写的论文基于GUI的...文章一共8页,写的非常详细,代码也比较多,希望想学习的朋友都来下载,另外,楼主一定要帮我点评一下,你的认可是对我最大的鼓励,希望这篇文章会是我的第2篇精品文章,诚望给予点评指正。

    自己写的论文基于GUI的图像处理软件平台的开发-GUI图像处理软件制作详细介绍论文.doc

    自己写的论文基于GUI的...文章一共8页,写的非常详细,代码也比较多,希望想学习的朋友都来下载,另外,楼主一定要帮我点评一下,你的认可是对我最大的鼓励,希望这篇文章会是我的第2篇精品文章,诚望给予点评指正。

    分享关于MATLABGUI的200多个例子源码-《精通MATLAB GUI》光盘的内容.rar

    所有例子出自《精通MATLAB GUI设计》一书,本书涵盖三个章节: 1、基础入门篇 2、设计提高篇 3、综合应用篇 涵盖了200多个例子,贴别是数学物理课件等GUI的制作,内容由浅入深,很值得学习,对于初学者来说是很...

    《Java语言程序设计——基础篇》第三章选择作业答案.zip

    进阶篇主要介绍数据结构、高级GUI设计、多线程、集合架构、网络和Web程序设计、算法效率和排序、MVC,以及高级Java数据库程序设计等方面的内容,循序渐进,可读性强。《Java语言程序设计——基础篇》以示例讲解解决...

    原创免费运动检测及测速GUI-src.zip

    内容详细说明:上篇:GUI制作 1.有两个GUI程序motion_detection.m和MotionDection2010.m,要实现的功能是打开motion_detection.m登录界面,点击其中的enter进入MotionDection2010.m界面进行运动目标检测及测速操作...

    原创免费运动检测及测速GUI-distrib.zip

    内容详细说明:上篇:GUI制作 1.有两个GUI程序motion_detection.m和MotionDection2010.m,要实现的功能是打开motion_detection.m登录界面,点击其中的enter进入MotionDection2010.m界面进行运动目标检测及测速操作...

    BiliChat-Console:BiliChat 的第三方 GUI

    BiliChat-Console一个 BiliChat 的第三方 GUI注:直播弹幕来自背景图片是 的专栏 的封面这是个什么? 的第三方 GUI 管理器。关于 BiliChat 的详细信息请查阅 和目前实现了以下功能自动部署 Node.Js 运行库和安装 ...

    《Java语言程序设计——基础篇》第三章选择示例.zip

    进阶篇主要介绍数据结构、高级GUI设计、多线程、集合架构、网络和Web程序设计、算法效率和排序、MVC,以及高级Java数据库程序设计等方面的内容,循序渐进,可读性强。《Java语言程序设计——基础篇》以示例讲解解决...

    Android反编译三件套 理之改 、dex2jar、jd-gui

    理之改需要配合jdk , jdk我也上传了 , 还在审核 , 另外这篇文章可以参考一下https://www.cnblogs.com/xw885/articles/3554773.html

    ARD_frequencyrespon​se_gui():GUI 绘制 ARD 系统的传递函数,使用滑块设置参数值-matlab开发

    GUI 绘制 ARD 系统的传递函数/频率响应函数 [1],使用滑块设置参数值。 ARD 系统是用于实时预测平滑信号的线性系统。 由于它是无模型的,所有 ARD 应用程序都具有相同的传递函数, 最多特定的参数值,其中有三个: 1...

    最简单的Ogre系列之三——添加自定义鼠标(不使用任何GUI)

    本程序是我的http://blog.csdn.net/zhuxiaoyang2000/archive/2011/05/11/6410811.aspx这篇文章中提到的所有资源。

    matlab自学课件

    第三篇 变量与数据结构 10 矩阵的处理与运算 11 字符与字符串 12 多维数组 13 单元数组 14 结构数组 15 稀疏矩阵 第四篇 程序设计 16 MATLAB的运算符 17 M文件 18 程序流程控制 19 程序调试 20 文件输出及输入 21 ...

    Unity3D大风暴之入门篇

    Unity3D大风暴之入门篇内容简介:《unity3d大风暴之入门篇(海量教学视频版)》是“unity大风暴”系列三部曲的第一部,系统地讲解了unity3d的基本操作和功能实现,包括对ngui、uniswf和scaleform等unity主流gui解决...

    宝典丛书:Python宝典 mobi

    全书内容共分三篇,分为入门篇、高级篇和案例篇。入门篇包括Python的认识和安装、开发工具简介、Python基本语法、数据结构与算法、多媒体编程、系统应用、图像处理和GUI编程等内容。高级篇包括用Python操作数据库、...

    Python宝典[杨佩璐编著] .zip

    《Python宝典》内容共分三篇,分为入门篇、高级篇和案例篇。入门篇包括Python的认识和安装、开发工具简介、Python基本语法、数据结构与算法、多媒体编程、系统应用、图像处理和GUI编程等内容。高级篇包括用Python...

    CC6开发应用教材基础篇

    第三节 WEB3D闪亮登场 8 第二章 Lyinux基础知识 9 第一节 2D与3D 9 第二节 3D世界是如何描述的 11 一、 空间位置 11 二、 视觉效果 12 三、 运动状态 13 第三节 有关LYINUX 13 一、 Lyinux的应用: 14 二、 Lyinux的...

    福优林@Qt5小白变大牛初级篇word---第2章.pdf

    第2章 Qt的HelloWorld(GUI)及剖析 65 ...2.4.3 步骤三:命令行编译生成exe 75 2.5 Qt程序的运行和发布 76 2.5.1 设置环境变量 76 2.5.2 生成.exe程序 77 2.5.3 使用windeployqt自动复制所依赖的dll 77

    嵌入式Linux应用开发完全手册

    第1篇 嵌入式Linux开发环境构建篇 第1章 嵌入式Linux开发概述 第2章 嵌入式Linux开发环境构建 第3章 嵌入式编程基础知识 第4章 Windows、Linux环境下相关工具、命令的使用 第2篇 ARM9嵌入式系统基础实例篇 第5章 ...

Global site tag (gtag.js) - Google Analytics