高清国产av一区二区三区_亚洲欧美日韩在线_无码熟妇人妻av在线影片免费_在线无码一级伊伊_爽好舒服高H自慰软件_亚洲熟女区偷拍区高清区_午夜福利影院啪啪_亚洲国产黄片在线播放_中文字幕日韩精品乐乐影院_久久国产亚洲日韩欧美精品

掃描二維碼關注

首頁 APP開發(fā)小程序開發(fā) 微信公眾號 網(wǎng)站建設 營銷推廣 經(jīng)典案列 產(chǎn)品服務 關于我們

“學習不僅是掌握知識”

向書本學習,還要向?qū)嵺`學習、向生活學習。消化已有知識,
而且要力求有所發(fā)現(xiàn)、有所發(fā)明、有所創(chuàng)造

Java性能優(yōu)化技巧集錦(三)

2019/3/21 19:18:21

Java性能優(yōu)化技巧集錦(三)

三、GUI篇

  這一部分介紹的內(nèi)容適合于圖形用戶界面的應用(Applet和普通應用),要用到AWT或Swing。

  3.1 用JAR壓縮類文件

  Java檔案文件(JAR文件)是根據(jù)JavaBean標準壓縮的文件,是發(fā)布JavaBean組件的主要方式和推薦方式。JAR檔案有助于減少文件體積,縮短下載時間。例如,它有助于Applet提高啟動速度。一個JAR文件可以包含一個或者多個相關的Bean以及支持文件,比如圖形、聲音、HTML 和其他資源。

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


  3.2 提示Applet裝入進程

  你是否看到過使用Applet的網(wǎng)站,注意到在應該運行Applet的地方出現(xiàn)了一個占位符?當Applet的下載時間較長時,會發(fā)生什么事情?最大的可能就是用戶掉頭離去。在這種情況下,顯示一個Applet正在下載的信息無疑有助于鼓勵用戶繼續(xù)等待。

  下面我們來看看一種具體的實現(xiàn)方法。首先創(chuàng)建一個很小的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);
// 創(chuàng)建待裝載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調(diào)用從stub程序傳遞到Applet
resize(width, height);
}
}

  編譯后的代碼小于2K,下載速度很快。代碼中有幾個地方值得注意。首先,PreLoader實現(xiàn)了AppletStub接口。一般地,Applet從調(diào)用者判斷自己的codebase。在本例中,我們必須調(diào)用setStub()告訴Applet到哪里提取這個信息。另一個值得注意的地方是, AppletStub接口包含許多和Applet類一樣的方法,但appletResize()方法除外。這里我們把對appletResize()方法的調(diào)用傳遞給了resize()方法。


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()方法被調(diào)用。如果需要進一步更新,該方法返回true;如果所需信息已經(jīng)得到,該方法返回false。

  3.4 覆蓋update方法

  update()方法的默認動作是清除屏幕,然后調(diào)用paint()方法。如果使用默認的update()方法,頻繁使用圖形的應用可能出現(xiàn)顯示閃爍現(xiàn)象。要避免在paint()調(diào)用之前的屏幕清除操作,只需按照如下方式覆蓋update()方法:

public void update(Graphics g) {
paint(g);
}

  更理想的方案是:覆蓋update(),只重畫屏幕上發(fā)生變化的區(qū)域,如下所示:

public void update(Graphics g) {
g.clipRect(x, y, w, h);
paint(g);
}

3.5 延遲重畫操作

  對于圖形用戶界面的應用來說,性能低下的主要原因往往可以歸結為重畫屏幕的效率低下。當用戶改變窗


深圳市南山區(qū)南山街道南海大道西桂廟路北陽光華藝大廈1棟4F、4G-04

咨詢電話:136 8237 6272
大客戶咨詢:139 0290 5075
業(yè)務QQ:195006118
技術QQ:179981967

精銳軟件

Copyright? 2018-2023 深圳精銳軟件技術有限公司 All Rights Reserved. ICP備案號:粵ICP備18108116號-8 公安備案號:粵公網(wǎng)安備44030502009460號