抽象窗口化工具(AWT)爲圖形用戶界面編程提供API編程接口,使得Java能夠提供較好的圖形用戶界面。java
AWT把圖形處理分爲兩個層次:一是處理原始圖形,這一層較原始,圖形直接以點、線和麪的形式畫到界面上;二是提供大量組件,實現可定製的圖形用戶界面。編程
1 Paint方法、Update方法和Repaint方法app
1) Paint方法ide
public void paint(Graphics g)函數
以畫布爲參數,在畫布上執行畫圖方法。在Applet中,不顯式地調用paint方法。工具
2) Repaint方法佈局
Applet重畫時系統自動調用paint方法。字體
3) Update方法this
public void update(Graphics g)spa
更新容器,向Repaint發出刷新小應用程序的信號,缺省的Update方法清除Applet畫圖區並調用Paint方法。
2 Graphics類
Graphics類是全部圖形上下文的抽象基類,容許應用程序在各類設備上實現組件的畫圖。圖形對象封裝了Java支持的基本渲染操做的狀態信息,包括畫圖的組件對象、渲染區域的座標(coordinates)、區域(clip)、顏色(color)、字體(font)、畫圖模式等。Graphics類提供畫各類圖形的方法,其中包括線、圓和橢圓、矩形和多邊形、圖像以及各類字體的文本等。這些方法具體以下:
public abstract void clipRect(int x, int y, int width, int height) 指定的區域切分。
Paint顏料屬性決定線條繪製的顏色。 Font字體。Stroke 畫筆屬性肯定線型,如實線、虛線或點劃線。 Transform轉換屬性定義渲染過程當中應用的轉換方法,使繪製的圖形平移、旋轉和縮放。
Composite 合成屬性決定如何在組件上繪製疊放圖形。Clip剪切屬性定義組件上的一個區域邊界。
public abstract void drawLine(int x1, int y1, int x2, int y2) 使用當前顏色,在點(x1, y1) 和 (x2, y2) 之間畫線。
public abstract void drawOval(int x, int y, int width, int height) 畫橢圓。
public abstract void fillOval(int x, int y, int width, int height) 畫實心橢圓。
public abstract void drawPolygon(int[] xPoints, int[] yPoints, int nPoints) 畫x和y座標定義的多邊形。
public void drawRect(int x, int y, int width, int height) 畫矩形。
public abstract void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) 使用當前顏色畫圓角矩形。
public abstract void drawString(String str, int x, int y) 使用當前字體和顏色畫字符串str。
public abstract void setColor(Color c) 設置圖形上下文的當前顏色。
public abstract void setPaintMode() 設置畫模式。
public abstract boolean drawImage(Image img, int x, int y, ImageObserver observer) 畫特定圖。
public abstract void setFont(Font font) 設置特定的font字體。使用時首先獲得font對象的一個實例,Font類經常使用構造函數爲:
public Font(String name, int style, int size)
經過指定的name、style和size建立字體實例。name指字體名,像「隸書」、「TimesRoman」等,字體風格爲粗體、斜體,size指字號大小。
例如:
Font f = new Font("TimesRoman",Font.BOLD + Font.ITALIC, 12);
建立了具備粗斜體風格的12磅的TimesRoman字體。
例:
1 import java.awt.*; 2 import java.applet.*; 3 import java.awt.geom.*; 4 public class UseColor extends Applet 5 { 6 public void paint(Graphics oldg) 7 { 8 Graphics2D g = (Graphics2D)oldg; 9 g.setColor(Color.blue); 10 g.fill(new Ellipse2D.Float(50,50,150,150)); 11 g.setColor(new Color(255,0,0,0)); 12 g.fill(new Ellipse2D.Float(50,50,140,140)); 13 g.setColor(new Color(255,0,0,64)); 14 g.fill(new Ellipse2D.Float(50,50,130,130)); 15 g.setColor(new Color(255,0,0,128)); 16 g.fill(new Ellipse2D.Float(50,50,110,110)); 17 g.setColor(new Color(255,0,0,255)); 18 g.fill(new Ellipse2D.Float(50,50,90,90)); 19 g.setColor(new Color(255,200,0)); 20 g.fill(new Ellipse2D.Float(50,50,70,70)); 21 } 22 }
輸出結果:
3 Graphics2D類
Graphics2D類繼承於Graphics類,提供幾何學、座標變換、顏色管理以及文本排列等的更高級控制。
Graphics2D類是Java平臺上渲染二維圖形、文字、以及圖片的基礎類,提供較好的對繪製形狀、填充形狀、旋轉形狀、繪製文本、繪製圖像以及定義顏色的支持。
在AWT編程接口中,用戶經過Paint方法接收Graphics對象做爲參數,如果使用Graphics2D類,就須要在Paint方法中進行強制轉換。
Public void paint(Graphics old)
{
Graphics2D new = (Graphics2D)old;
}
3.1 繪製形狀
Graphics2D提供如下兩個方法進行形狀的繪製:
public abstract void draw(Shape s)
根據Graphics2D的環境設置畫出形狀s,其中Shape接口包含的類如表所示。
其中GeneralPath是通常的幾何路徑,它的構造函數爲:
public GeneralPath() 構造一個空的對象。
經常使用的方法有四個,分別以下:
public void lineTo(float x, float y) 從當前座標點到(x,y)座標點畫一條直線,將此點添加到路徑上。
public void moveTo(float x, float y) 移動到座標點(x,y),在路徑上添加此點。
public abstract void fill(Shape s) 畫實心形狀s。
public void quadTo(float x1, float y1, float x2, float y2) 以座標點(x1,y1)爲控制點,在當前座標點和座標點(x2,y2)之間插入二次曲線片段。
public void curveTo(float x1, float y1, float x2, float y2, float x3, float y3) 以(x1,y1)和(x2,y2)爲控制點,在當前座標點和(x3,y3)之間插入曲線片段。
在Draw方法中提到Graphics2D的環境設置。所謂的環境設置是指設置畫圖的筆畫和填充屬性等,設置方法分別以下:
public abstract void setStroke(Stroke s) 設置筆畫的粗細。其中Stroke接口中經常使用BasicStroke類來實現,一個較簡單的構造函數爲
public BasicStroke(float width) 建立實線筆畫寬度爲width。
public abstract void setPaint(Paint paint)
設置Graphics2D環境的填充屬性。其中,paint的值能夠爲漸變填充類java.awt.GradientPaint,也能夠爲圖形填充類java.awt.TexturePaint,漸變填充類經常使用構造函數爲
public GradientPaint(float x1, float y1, Color color1, float x2, float y2, Color color2, boolean cyclic)
構建一個漸變GradientPaint對象,在起始座標點到目標座標點之間從顏色color1到color2漸變,cyclic爲真,循環漸變。
1 package test; 2 3 import java.awt.*; 4 import java.applet.*; 5 import java.awt.geom.*; 6 public class GUI2D extends Applet 7 { 8 /** 9 * 10 */ 11 private static final long serialVersionUID = 5012904640684084416L; 12 13 public void paint(Graphics oldg) 14 { 15 Graphics2D g = (Graphics2D)oldg; 16 //設置筆畫寬度 17 BasicStroke stroke = new BasicStroke(10); 18 g.setStroke(stroke); 19 //畫線 20 Line2D line = new Line2D.Float(0,0,20,30); 21 g.draw(line); 22 line = new Line2D.Float(50,50,100,50); 23 g.draw(line); 24 line = new Line2D.Float(50,50,50,100); 25 g.draw(line); 26 stroke = new BasicStroke(5); 27 g.setStroke(stroke); 28 //設置漸變填充 29 GradientPaint gt = new GradientPaint(0,0,Color.green,50,30,Color.blue,true); 30 g.setPaint((Paint)gt); 31 //畫矩形 32 Rectangle2D rect = new Rectangle2D.Float(80,80,40,40); 33 g.draw(rect); 34 rect = new Rectangle2D.Float(100,100,40,40); 35 g.fill(rect); 36 //畫橢圓 37 Ellipse2D ellipse = new Ellipse2D.Float(120,120,30,40); 38 g.draw(ellipse); 39 gt = new GradientPaint(0,0,Color.red,30,30,Color.yellow,true); 40 g.setPaint((Paint)gt); 41 ellipse = new Ellipse2D.Float(140,140,20,20); 42 g.fill(ellipse); 43 //畫圓角矩形 44 RoundRectangle2D roundRect = new RoundRectangle2D.Float(160,160,40,40,20,20); 45 g.draw(roundRect); 46 roundRect = new RoundRectangle2D.Float(180,180,40,40,20,20); 47 g.fill(roundRect); 48 //畫幾何圖形 49 GeneralPath path = new GeneralPath(); 50 path.moveTo(150,0); 51 path.lineTo(160,50); 52 path.curveTo(190,200,240,140,200,100); 53 g.fill(path); 54 } 55 }
輸出結果:
3.2 繪製文本
Graphics2D類提供一個文本佈局(TextLayout)對象,用於實現各類字體或段落文本的繪製。其構造函數爲:
public TextLayout(String string, Font font, FontRenderContext frc) 經過字符串string和字體font構造佈局。
public void draw(Graphics2D g2, float x, float y) 將這個TextLayout對象畫到Graphics2D對象g2上的x,y座標處。
public Rectangle2D getBounds() 返回TextLayout對象的區域。
例:
1 import java.awt.*; 2 import java.applet.*; 3 import java.awt.geom.*; 4 import java.awt.font.*; 5 public class GUIText extends Applet 6 { 7 public void paint(Graphics oldg) 8 { 9 Graphics2D g = (Graphics2D)oldg; 10 //設置字體 11 Font f1 = new Font("Courier",Font.PLAIN,24); 12 Font f2 = new Font("helvetica",Font.BOLD,24); 13 FontRenderContext frc = g.getFontRenderContext(); 14 String str = new String("這是一個文本佈局類的實現"); 15 String str2 = new String("擴充繪製文本的功能"); 16 //構造文本佈局對象 17 TextLayout layout = new TextLayout(str, f1, frc); 18 Point2D loc = new Point2D.Float(20,50); 19 //繪製文本 20 layout.draw(g, (float)loc.getX(), (float)loc.getY()); 21 //設置邊框 22 Rectangle2D bounds = layout.getBounds(); 23 bounds.setRect(bounds.getX()+loc.getX(), 24 bounds.getY()+loc.getY(), 25 bounds.getWidth(), 26 bounds.getHeight()); 27 g.draw(bounds); 28 layout = new TextLayout(str2,f2,frc); 29 g.setColor(Color.red); 30 layout.draw(g,20,80); 31 } 32 }
3.3 繪製圖像
繪製圖像用到BufferedImage類,BufferedImage類是指存放圖像數據的可訪問的緩衝。其構造函數爲:
public BufferedImage(int width, int height, int imageType) 使用寬度(width)、高度(height)和imageType類型構造BufferedImage對象。
public Graphics2D createGraphics() 用圖片填充橢圓的具體過程以下:
(1) 建立一個Graphics2D,能夠畫到BufferedImage中。
例如構建一個BufferedImage對象buf。
BufferedImage buf = new BufferedImage (img.getWidth(this),
img.getHeight(this),BufferedImage.TYPE_INT_ARGB);
建立一個臨時Graphics2D對象:
Graphics tmpG = buf.createGraphics();
將圖像畫入臨時緩衝:
tmpG.drawImage(img,10,10,this);
(2) 用TexturePaint類進行填充:
public TexturePaint(BufferedImage txtr, Rectangle2D anchor)
構造TexturePaint對象,須要一個Rectangle2D對象來存放該對象:
Rectangle2D rect = new Rectangle2D.Float(0,0,h,w);
TexturePaint t = new TexturePaint(buf,rect);
(3) 而後設置填充模式,並進行填充:
g.setPaint(t);
g.fill(new Ellipse2D.Float(100,50,60,60));
例:完成圖像顯示,並將區域藍色透明顯示,而後進行圖片填充
1 import java.awt.*; 2 import java.applet.*; 3 import java.awt.geom.*; 4 import java.awt.font.*; 5 import java.awt.image.*; 6 import java.net.*; 7 public class GUIImage extends Applet 8 { 9 public void paint(Graphics oldg) 10 { 11 Graphics2D g = (Graphics2D)oldg; 12 try 13 { 14 URL imgURL = new URL(getDocumentBase(),"sample.gif"); 15 Image img = getImage(imgURL); 16 int h = img.getHeight(this); 17 int w = img.getWidth(this); 18 //構造緩衝圖像對象 19 BufferedImage buf = new BufferedImage(w,h,BufferedImage.TYPE_INT_ARGB); 20 //放入臨時圖形類 21 Graphics tmpG = buf.createGraphics(); 22 tmpG.drawImage(img,10,10,this); 23 g.drawImage(buf,10,20,this); 24 //設置透明顏色對象 25 Color transBlue = new Color(0,0,255,100); 26 g.setColor(transBlue); 27 GeneralPath path = new GeneralPath(); 28 path.moveTo(60,0); 29 path.lineTo(50,100); 30 path.curveTo(160,230,240,140,200,100); 31 g.fill(path); 32 transBlue = new Color(0,0,255,240); 33 g.fill(new Ellipse2D.Float(100,100,50,50)); 34 Rectangle2D rect = new Rectangle2D.Float(0,0,h,w); 35 //圖片填充 36 TexturePaint t = new TexturePaint(buf,rect); 37 g.setPaint(t); 38 g.fill(new Ellipse2D.Float(100,50,60,60)); 39 } 40 catch(Exception e) 41 { 42 System.out.println("Error:" + e.getMessage()); 43 } 44 } 45 }