`

三、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();
}

相关推荐

    Java GUI 绘制出三角形

    本篇将重点讲解如何在Java GUI中绘制出一个三角形,这涉及到Java的AWT和Swing库。 首先,Java中的`java.awt.Graphics`类提供了基本的绘图功能,它允许我们在组件上绘制各种形状。为了在GUI中绘制三角形,我们需要...

    java GUI 事件监听

    本篇文章将围绕一个具体的示例——绘制一个棋盘并实现按钮与面板的事件监听,来深入探讨相关的Java GUI编程技巧。 #### 二、核心知识点 ##### 1. 导入必要的包 在编写Java GUI程序时,通常需要导入以下几个关键包...

    基于MATLABGUI及三维图形视角变化制作信号与系统课件

    本篇文章探讨了如何运用MATLAB GUI(图形用户界面)结合三维图形视角变化技术来设计信号与系统的教学课件。该方法通过MATLAB GUI平台实现对信号与系统的可视化展示,特别是针对周期方波信号的分解进行了详细的阐述。...

    MAtlab GUI 入门基本实例创建.doc

    #### 三、GUI 创建步骤详解 1. **启动 GUIDE**: - 在 MATLAB 命令窗口中输入 `guide` 并按回车键,即可启动 GUIDE 工具。 2. **新建 GUI**: - 选择“Blank GUI (Default)”选项创建一个新的空白 GUI。 - 或者...

    基于Matlab GUI的脑胶质瘤三维显示辅助诊断系统的设计.pdf

    本篇论文主要介绍了基于Matlab GUI(Graphical User Interface,图形用户界面)的脑胶质瘤三维显示辅助诊断系统的设计。脑胶质瘤作为颅脑肿瘤中最常见的类型,给患者的生命安全带来了极大的威胁,而MRI作为脑胶质瘤...

    matlab gui外文书籍

    本篇文章将基于提供的部分书籍内容,对MATLAB GUI 中的基本图形绘制、动画制作、句柄图形对象创建以及使用图形用户界面开发环境(GUIDE)创建 GUI 进行详细介绍。 #### 二、基本图形绘制 在 MATLAB 中进行图形绘制...

    利用gui建立三维聚类

    本篇主要聚焦于如何利用MATLAB的图形用户界面(GUI)来实现三维聚类。 MATLAB是一个强大的数学计算环境,其GUI功能可以方便地创建交互式应用程序,包括对数据进行处理和分析的工具。在标题提到的"利用GUI建立三维...

    Matlab GUI做的简单计算器

    本篇将详细介绍如何利用Matlab GUI构建一个简单的计算器。 一、Matlab GUI基础 1. **GUIDE工具**:MATLAB提供的GUI开发环境是GUIDE(Graphical User Interface Development Environment),它允许用户通过拖拽控件...

    数字图像处理GUI界面设计

    本篇文章将深入探讨GUI的设计原理、实现方法以及在数字图像处理中的应用。 一、设计任务及要求 1.1 设计依据 GUI设计的主要依据是用户友好性和功能性。用户界面应直观易用,同时满足特定的图像处理功能需求,如...

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

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

    基于MATLAB_GUI的二阶低通电路频率响应分析与仿真.pdf

    本篇论文详细介绍了如何利用MATLAB及其GUI功能对二阶低通电路的频率响应进行分析与仿真。 二阶低通电路是一种动态电路,其输出响应会随着电路参数或结构的变化而迅速变化。频率响应是指电路对不同频率信号的响应...

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

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

    搭建最简单的GUI界面框架

    本篇文章将详细介绍如何搭建最简单的GUI界面框架,帮助初学者快速入门。 一、选择合适的GUI库 在Python中,有许多库可以用来创建GUI界面,如Tkinter(内置库)、PyQt、wxPython、Kivy等。对于初学者来说,Tkinter...

    MATLAB GUI函数查询

    本篇文章将重点介绍MATLAB GUI中的部分核心函数,帮助读者更好地理解和掌握这些函数的应用场景与实现方法。 #### 二、关键GUI函数详解 1. **`uicontrol`** - 创建用户界面控件。 - 这个函数用于创建各种控件,如...

    jd-gui反编译java 文件

    本篇文章将详细讲解如何使用jd-gui来反编译Java文件。 首先,jd-gui是一个图形界面的Java反编译器,由JDI(Java Debug Interface)支持,它能够将已编译的Java字节码转换回可读性强的源代码。这对于调试、分析或者...

    JAVA GUI开发

    本篇文章将深入探讨Java GUI开发的基本原理,包括其设计技术以及一些高级特性。 一、Java GUI的基础 1. **AWT(Abstract Window Toolkit)框架**:这是Java早期提供的GUI库,包含了一系列基本的组件(如Button、...

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

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

    Java GUI 界面编程课件 清华大学

    本篇内容来自清华大学的Java GUI界面编程课件,由雍俊海教授编写。课程可能涵盖了Java程序设计的基础知识以及深入到GUI设计的各个方面。 首先,雍俊海的《Java程序设计教程》是该课程的主要教材,出版于2007年,...

Global site tag (gtag.js) - Google Analytics