[Download] Java 2D API 程序員指南
Programmer's Guide to the JavaTM 2D API 中文版http://www.aygfsteel.com/Files/leon/Java2DAPI程序員指南.rar
posted @ 2005-09-13 17:09 leon 閱讀(2322) | 評論 (5) | 編輯 收藏
像寫情書一樣coding
posted @ 2005-09-13 17:09 leon 閱讀(2322) | 評論 (5) | 編輯 收藏
使用sun提供的圖像管理工具包 Jimi1_0 版本,保存PICT文件格式時輸出的圖像寬、高和內存中的圖像源一致,可是顯示出來卻是純白的。這是 Jimi1_0 版本對寫Pict格式的一處 BUG,下載了新的補訂類PICTWriter.java?重新編譯成PICTWriter.class加入 JimiProClasses.zip 中覆蓋原有的 PICTWriter.class,遂寫 PICT 格式成功。
參考:http://amug.org/~glguerin/other/index.html#PICTWriter
提醒:編譯 PICTWriter.java 時需要兼容JDK以前的版本。
posted @ 2005-07-21 12:28 leon 閱讀(1293) | 評論 (1) | 編輯 收藏
圖像的異步加載
圖像的加載和顯示是異步進行的,圖像 的生產者(ImageProducer)傳遞給圖像的消費者(ImageConsumer)一個與圖像相關的位,因為圖像的生產過程是一個異步行為,所以 AWT 也提供一個圖像觀察(ImageObserver),用來監(jiān)視圖像生產者的圖像生產過程。
因為 java.awt.Component 實現 ImageObserver 接口,所以 AWT 中每個構件都是ImageObserver ,當一個給定的 ImageProducer 采取異步操作時,這個 ImageObserver 可以選擇是否被更新。
現在看一個例子:
當這個 Applet 第一次被調用時,將打印出下面的結果:
drawing?image...
false
drawing?image...
false
drawing?image...
false
drawing?image...
true
執(zhí)
行結果說明 drawImage() 在第一次被調用時,沒有圖像被加載,drawImage() 只是向和圖像相關的 ImageProducer
注冊 ImageObserver,圖像被完全加載前 drawImage() 方法返回 false 直到圖像被完全加載返回 true。
當 drawImage() 返回之后,只要有圖像的新的部分被加載,ImageObserver 中的 imageUpdate() 方法就會被調用。當 ImageObserver 是 AWT 構件時,Component.imageUpdate() 調用 repaint() 方法清除構件背景并調用 paint() 方法重繪剛剛得到的圖像位。重復循環(huán),ImageProducer 加載圖像的下一塊,調用 ImageObserver 的 imageUpdate()。當圖像被完全加載時,ImageProducer 停止調用 ImageObserver 的 imageUpdate(),循環(huán)中斷。
load -> imageUpdate() -> repaint() -> update() -> paint()
等待圖像的完全加載
上面的例子介紹了圖像的異步加載,現在介紹2個方法使圖像完全加載前不顯示。
·重載 ImageObserver 中的 imageUpdate() 方法,使其在圖像完全加載前不調用 repaint()。
import
?java.awt.Graphics;
import
?java.awt.Image;
public
?
class
?ImageTestAppletWithUpdate
????
extends
?Applet?{
??
private
?Image?im;
??
public
?
void
?init()?{
????im?
=
?getImage(getCodeBase(),?
"
lena.jpg
"
);
??}
??
public
?
void
?paint(Graphics?g)?{
????g.drawImage(im,?
0
,?
0
,?
this
);
??}
??
public
?
boolean
?imageUpdate(Image?image,?
int
?flags,?
int
?x,?
int
?y,?
int
?w,?
int
?h)?{
????System.out.println(
"
imageUpdate():x=
"
?
+
?x?
+
?
"
,y=
"
?
+
?y?
+
?
"
,w=
"
?
+
?w?
+
?
"
,h=
"
?
+
???????????????????????h);
????
if
?(?(flags?
&
?ALLBITS)?
==
?
0
)?{
??????
return
?
true
;?
//
?need?more?updates
????}
????
else
?{
??????repaint();
??????
return
?
false
;?
//
?image?is?fully?loaded
????}
??}
}
使用 java.awt.MediaTracker 類跟蹤圖像的加載,不必重載 imageUpdate() 方法。
import
?java.applet.Applet;
import
?java.awt.Graphics;
import
?java.awt.Image;
import
?java.awt.MediaTracker;
public
?
class
?ImageTestAppletWithMediaTracker
????
extends
?Applet?{
??
private
?Image?im;
??
public
?
void
?init()?{
????im?
=
?getImage(getCodeBase(),?
"
lena.jpg
"
);
????MediaTracker?tracker?
=
?
new
?MediaTracker(
this
);
????tracker.addImage(im,?
0
);
????
try
?{
??????tracker.waitForID(
0
);
????}
????
catch
?(InterruptedException?e)?{
??????e.printStackTrace();
????}
????System.out.print(
"
Image?width?=?
"
?
+
?im.getWidth(
this
));
????System.out.println(
"
height?=?
"
?
+
?im.getHeight(
this
));
??}
??
public
?
void
?paint(Graphics?g)?{
????g.drawImage(im,?
0
,?
0
,?
this
);
??}
}
我們可以把使用 java.awt.MediaTracker 類將圖像完全加載的方法包裝成一個實用方法
???*?使用?java.awt.MediaTracker?將圖像完全加載。
???*?
@param
?component?Component
???*?
@param
?img?Image
???
*/
??
public
?
static
?
void
?waitForImage(Component?component,?Image?img)?{
????MediaTracker?tracker?
=
?
new
?MediaTracker(component);
????
try
?{
??????tracker.addImage(img,?
0
);
??????tracker.waitForID(
0
);
????}
????
catch
?(InterruptedException?ex)?{
??????ex.printStackTrace();
????}
??}
posted @ 2005-07-12 10:33 leon 閱讀(1396) | 評論 (0) | 編輯 收藏
posted @ 2005-07-12 10:31 leon 閱讀(3088) | 評論 (6) | 編輯 收藏