AWT 提供了一些用戶(hù)接口的構(gòu)件,但是它不提供一些類(lèi)似的純粹的繪制圖形的對(duì)象,例如 Rectangle、Polygon 和 Point 類(lèi)沒(méi)有任何繪制圖形的能力。換句話說(shuō)它們不具備 draw 方法,僅僅可以設(shè)置和的到它們代表的幾何實(shí)體的信息。
為了代替那些純粹的、可繪制圖形的對(duì)象,AWT 使用了一種簡(jiǎn)單的模式。每個(gè) AWT 構(gòu)件完全來(lái)自于它自己的 java.awt.Graphics 對(duì)象。
java.awt.Graphics 是一個(gè)抽象類(lèi),其作用是定義一個(gè)真正的工具,用來(lái)接受圖形操作。
表一:傳遞一個(gè)對(duì) Graphics 的引用的 JDK 方法
java.awt |
Canvas |
paint(Graphics g) |
|
Component |
paint(Graphics g) |
|
Component |
paintAll(Graphics g) |
|
Component |
print(Graphics g) |
|
Component |
printAll(Graphics g) |
|
Component |
update(Graphics g) |
|
Container |
paint(Graphics g) |
|
Container |
paintComponents(Graphics g) |
|
Container |
print(Graphics g) |
|
Container |
printComponents(Graphics g) |
|
ScrollPane |
printComponents(Graphics g) |
java.beans |
Property-Editor |
paintValue(Graphics g, Rectangle r) |
|
Property-EditorSupport |
paintValue(Graphics g, Rectangle r) |
表二:返回 Graphics 引用的 JDK 方法
java.awt |
Component |
getGraphics() |
|
Image |
getGraphics() |
|
PrintJob |
getGraphics() |
|
Graphics |
create() |
|
Graphics |
create(intx, int y, int w, int h) |
Graphics 類(lèi)履行2個(gè)主要的職責(zé):
· 設(shè)置和獲取圖形參數(shù)。
· 在輸出設(shè)備中執(zhí)行圖形操作。
得到構(gòu)件的 Graphics 的引用有2種方法:
· 重載 表一 中的方法(傳遞 Graphics 的引用)
· 調(diào)用 表二 中的方法(返回 Graphics 的副本)
Graphics 對(duì)象的壽命
除了使用 表二 的方法得到的 Graphics 的副本外,使用 表一 的方法得到的 Graphics 的引用只有在方法的執(zhí)行過(guò)程中才有效(例如重載的 paint() 和 update() 等方法)。一旦方法返回,引用將不再有效。
通過(guò)使用 表二 的方法得到的 Graphics 的對(duì)象使用完后需要調(diào)用 Graphics.dispose() 方法處理。
// 程序片斷
public void someMethodInAComponent(){
Graphics g = getGraphics();
if(g != null){
try{
// ...
// ...
}
finally{
g.dispose();
}
}
}
Graphics 類(lèi)還提供2個(gè)方法創(chuàng)建 Graphics 對(duì)象:
· Graphics create()
創(chuàng)建精確的 Graphics 副本。
· Graphics create(int x, int y, int w, int h)
創(chuàng)建一個(gè)副本,但是,變?cè)付ㄒ粋€(gè)平移量 (x, y) 和一個(gè)新的剪貼矩形 (x, y, w, h)。create(int, int, int, int) 返回的 Graphics 的原點(diǎn)被轉(zhuǎn)換成 (x, y) 的坐標(biāo),但是剪貼矩形轉(zhuǎn)換為原剪貼矩形和指定矩形的交集。
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class CreateTest extends Applet{
private Image image;
public void init(){
image = getImage(getCodeBase(),"lena.jpg");
try{
MediaTracker mt = new MediaTracker(this);
mt.addImage(image,0);
mt.waitForID(0);
}
catch(InterruptedException e){
e.printStackTrace();
}
}
public void paint(Graphics g){
Graphics copy = g.create(image.getWidth(this),0,image.getWidth(this),image.getHeight(this));
try{
System.out.println("g: " + g.getClip().toString());
System.out.println("copy: " + copy.getClip().toString());
g.drawImage(image,0,0,this);
copy.drawImage(image,0,0,this);
}
finally{
copy.dispose();
}
}
}