JavaGraphics類的繪圖方法


Graphics類提供基本繪圖方法,Graphics類提供基本的幾何圖形繪制方法,主要有:畫線段、畫矩形、畫圓、畫帶顏色的圖形、畫橢圓、畫圓弧、畫多邊形、畫字符串等。

1. 畫線段:在窗口中畫一條線段,可以使用Graphics類的drawLine()方法:

/**
 * 在此圖形上下文的坐標系中,使用當前顏色在點 (x1, y1) 和 (x2, y2) 之間畫一條線
 * 
 * @param x1
 *            第一個點的 x 坐標
 * @param y1
 *            第一個點的 y 坐標
 * @param x2
 *            第二個點的 x 坐標
 * @param y2
 *            第二個點的 y 坐標
 */
public abstract void drawLine(int x1, int y1, int x2, int y2)

例如,以下代碼在點(3,3)與點(50,50)之間畫線段,在點(100,100)處畫一個點。

g.drawLine(3,3,50,50); //畫一條線段

g.drawLine(100,100,100,100); //畫一個點。

2. 畫矩形

矩形有兩種:普通型和圓角型。

A. 畫普通矩形

有如下兩個方法畫普通矩形:

/**
 * 繪制指定矩形的邊框。矩形的左邊緣和右邊緣分別位於 x 和 x + width。
 * 上邊緣和下邊緣分別位於 y 和 y + height。使用圖形上下文的當前顏色繪制該矩形。
 */
public void drawRect(int x, int y, int width, int height)

/**
 * 填充指定的矩形。該矩形左邊緣和右邊緣分別位於 x 和 x + width - 1。
 * 上邊緣和下邊緣分別位於 y 和 y + height - 1。
 * 得到的矩形覆蓋 width 像素寬乘以 height 像素高的區域。
 * 使用圖形上下文的當前顏色填充該矩形。
 */
public abstract void fillRect(int x, int y, int width, int height)

參數x表示要繪制圖形的 x 坐標,y 表示要繪制圖形的 y 坐標,width 表示圖形寬度,height 表示圖形高度。

以下代碼是畫矩形的例子:

g.drawRect(80,100,40,25); // 畫矩形線框

g.setColor(Color.yellow);
g.fillRect(20,70,20,30); // 畫矩形着色塊

B. 畫圓角矩形

畫圓角矩形也有兩個方法:

/**
 * 用此圖形上下文的當前顏色繪制圓角矩形的邊框。
 * 矩形的左邊緣和右邊緣分別位於 x 和 x + width。
 * 矩形的上邊緣和下邊緣分別位於 y 和 y + height。
 */
public abstract void drawRoundRect(int x, int y, int width, int height,
        int arcWidth, int arcHeight)

/**
 * 用當前顏色填充指定的圓角矩形。
 * 矩形的左邊緣和右邊緣分別位於 x 和 x + width - 1。
 * 矩形的上邊緣和下邊緣分別位於 y 和 y + height - 1。
 */
public abstract void fillRoundRect(int x, int y, int width, int height,
        int arcWidth, int arcHeight)

參數 arcWidth 表示4個角弧度的水平直徑,arcHeight 表示4個角弧度的垂直直徑。

以下代碼是畫矩形的例子:

g.drawRoundRect(10,10,150,70,40,25); // 畫一個圓角矩形

g.setColor(Color.blue); g.fillRoundRect(80,100,100,100,60,40); // 填充一個圓角矩形塊

g.drawRoundRect(10,150,40,40,40,40); // 畫圓

g.setColor(Color.red); g.fillRoundRect(80,100,100,100,100,100);//畫圓塊

可以用畫圓角矩形方法畫圓形,當矩形的寬和高相等,圓角弧的橫向直徑和圓角弧的縱向直徑也相等,並等於矩形的寬和高時,畫的就是圓形。參見上述例子中的注釋,前一個是畫圓,后一個是塗圓塊。

C. 畫三維矩形

畫三維矩形有兩個方法:

/**
 * 繪制指定矩形的 3-D 高亮顯示邊框。
 * 矩形的邊是高亮顯示的,以至於從左上角看呈斜面並加亮。 
 * 高亮顯示效果所用的顏色根據當前顏色確定。
 * 得到的矩形覆蓋width + 1 像素寬乘以 height + 1 像素高的區域。
 */
public void draw3DRect(int x, int y, int width, int height, boolean raised)

/**
 * 繪制一個用當前顏色填充的 3-D 高亮顯示矩形。
 * 矩形的邊是高亮顯示的,以至於從左上角看呈斜面並加亮。
 * 高亮顯示效果所用的顏色根據當前顏色確定
 */
public void fill3DRect(int x, int y, int width, int height, boolean raised)

參數 raised 表示一個用於確定矩形是凸出平面顯示還是凹入平面顯示的 boolean 值。

以下代碼是畫突出矩形的例子:

g.draw3DRect(80,100,40,25,true); // 畫一個3D矩形線框

g.setColor(Color.yellow); 
g.fill3DRect(20,70,20,30,true); // 畫一個3D矩形着色塊

3. 畫橢圓形

橢圓形由橢圓的橫軸和縱軸確定。畫橢圓形有兩個方法:

/**
 * 繪制橢圓的邊框。
 * 得到一個圓或橢圓,它剛好能放入由 x、y、width 和 height 參數指定的矩形中。
 * 橢圓覆蓋區域的寬度為 width + 1 像素,高度為 height + 1 像素。
 */
public abstract void drawOval(int x, int y, int width, int height)

/**
 * 使用當前顏色填充外接指定矩形框的橢圓。
 */
public abstract void fillOval(int x, int y, int width, int height)

也可以用畫橢圓形方法畫圓形,當橫軸和縱軸相等時,所畫的橢圓形即為圓形。

以下代碼是畫橢圓形的例子:

g.drawOval(10,10,60,120); // 畫橢圓

g.setColor(Color.cyan);g.fillOval(100,30,60,60); // 填充圓塊

g.setColor(Color.magenta);g.fillOval(15,140,100,50); // 填充橢圓

4. 畫圓弧

畫圓弧有兩個方法:

/**
 * 繪制一個覆蓋指定矩形的圓弧或橢圓弧邊框。
 */
public abstract void drawArc(int x, int y, int width, int height,
        int startAngle, int arcAngle)

/**
 * 填充覆蓋指定矩形的圓弧或橢圓弧。
 */
public abstract void fillArc(int x, int y, int width, int height,
        int startAngle, int arcAngle)

參數 startAngle 表示開始角度,arcAngle 表示相對於開始角度而言弧跨越的角度。

得到的弧從 startAngle 開始跨越 arcAngle 度。對角度的解釋如下:0 度角位於 3 點鍾位置。正值指示逆時針旋轉,負值指示順時針旋轉。

弧的中心是矩形的中心,此矩形的原點為 (x, y),大小由 width 和 height 參數指定。

得到的弧覆蓋 width + 1 像素寬乘以 height + 1 像素高的區域。

角度是相對於外接矩形的非正方形區域指定的,45 度角始終落在從橢圓中心到外接矩形右上角的連線上。因此,如果外接矩形在一個軸上遠遠長於另一個軸,則弧段的起點和結束點的角度將沿邊框長軸發生更大的偏斜。

以下代碼是畫圓弧的例子:

g.drawArc(10,40,90,50,0,180); // 畫圓弧線

g.drawArc(100,40,90,50,180,180); // 畫圓弧線

g.setColor(Color.yellow); 
g.fillArc(10,100,40,40,0,-270); // 填充缺右上角的四分之三的橢圓

g.setColor(Color.green); 
g.fillArc(60,110,110,60,-90,-270); // 填充缺左下角的四分之三的橢圓

5. 畫多邊形

多邊形是用多條線段首尾連接而成的封閉平面圖。多邊形線段端點的x坐標和y坐標分別存儲在兩個數組中,畫多邊形就是按給定的坐標點順序用直線段將它們連起來。以下是畫多邊形常用的兩個方法:

/**
 * 繪制一個由 x 和 y 坐標數組定義的閉合多邊形。每對 (x, y) 坐標定義一個點。
 */
public abstract void drawPolygon(int[] xPoints, int[] yPoints, int nPoints);

/**
 * 填充由 x 和 y 坐標數組定義的閉合多邊形。
 */
public abstract void fillPolygon(int[] xPoints, int[] yPoints, int nPoints)

繪制由 nPoint 個線段定義的多邊形,其中前 nPoint - 1 個線段是 1 ≤ i ≤ 時從 (xPoints[i - 1], yPoints[i - 1]) 到 (xPoints[i], yPoints[i]) 的線段。如果最后一個點和第一個點不同,則圖形會通過在這兩點間繪制一條線段來自動閉合。

以下代碼是畫多邊形的例子:

int px1[]={50,90,10,20};//首末點相重,才能畫多邊形

int py1[]={10,50,50,20};

int px2[]={140,180,170,180,140,100,110,140};

int py2[]={5,25,35,45,65,35,25,5};

g.setColor(Color.blue);

g.fillPolygon(px1,py1,4);

g.setColor(Color.red);

g.drawPolygon(px2,py2,8);

也可以用多邊形對象畫多邊形。用多邊形類Polygon創建一個多邊形對象,然后用這個對象繪制多邊形。Polygon類的主要方法:

Polygon()  // 創建空的多邊形。 
Polygon(int[] xpoints, int[] ypoints, int npoints)  // 根據指定的參數構造並初始化新的 Polygon。 

public void addPoint(int x, int y) // 將一個坐標點加入到Polygon對象中。

使用Polygon多邊形對象繪制多邊形的方法:

public void drawPolygon(Polygon p) // 繪制多邊形。

public void fillPolygon(Polygon p) // 填充多邊形。

例如,以下代碼,畫一個三角形和填充一個黃色的三角形。注意,用多邊形對象畫封閉多邊形不要求首末點重合。

Polygon ponlygon1=new Polygon();    
polygon1.addPoint(50,10);   
polygon1.addPoint(90,50);   
polygon1.addPoint(10,50);   
g.drawPolygon(polygon1);    

int x[]={140,180,170,180,140,100,110,100};  
int y[]={5,25,35,45,65,45,35,25};   
Polygon polygon2 = new Polygon(x,y,8);  
g.setColor(Color.yellow);   
g.fillPolygon(polygon2);

6. 畫字符串

畫字符串的常用方法是:

/**
 * 使用此圖形上下文的當前字體和顏色繪制由指定 string 給定的文本。
 * 最左側字符的基線位於此圖形上下文坐標系的 (x, y) 位置處。
 */
public abstract void drawString(String str, int x, int y)

以下代碼是繪制字符串的例子:

g.setColor(Color.GREEN);
g.setFont(new Font("楷體", Font.BOLD, 20));
g.drawString("使用畫筆繪制的字符串內容", 220, 345);

7. 畫圖像

繪制圖像的常用方法:

boolean drawImage(Image img, int x, int y, ImageObserver observer) 
boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer) 
boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer) 
boolean drawImage(Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer) 

參數:

Image img – 需要繪制的圖像。

int x, int y – 圖像左上角坐標。

int width, int height – 圖像的寬度和高度。

Color bgcolor – 背景色,即圖像下面的顏色。如果圖像包含透明象素時這會有用,圖像將在指定顏色背景下顯示。

ImageObserver observer – 一個實現ImageObserver 接口的對象。它將該對象登記為一個圖像觀察者,因此當圖像的任何新信息可見時它被通知。大多組件可以簡單的指定this。

組件可以指定this作為圖像觀察者的原因是Component 類實現了ImageObserver 接口。當圖像數據被加載時它的實現調用repaint方法,這通常是你所期望的。

drawImage 方法只要要顯示的圖像數據已經加載完就返回。如果你要確保drawImage只繪制完整的圖像,那么你需要跟蹤圖像的加載。

例如,繪制一張圖片:

Image img = Toolkit.getDefaultToolkit().getImage("img/monster.gif");
g.drawImage(img, 510, 5, 200, 200, Color.LIGHT_GRAY, this);

8. 擦除矩形塊

當需要在一個着色圖形的中間有一個空缺的矩形的情況,可用背景色填充一矩形塊實現,相當於在該矩形塊上使用了 “橡皮擦”。實現的方法是:

/**
 * 通過使用當前繪圖表面的背景色進行填充來清除指定的矩形。
 */
public abstract void clearRect(int x, int y, int width, int height)

例如,以下代碼實現在一個圓中擦除一個矩形塊的着色:

g.setColor(Color.blue); 
g.fillOval(50,50,100,100);
g.clearRect(70,70,40,55);

9. 限定作圖顯示區域

用一個矩形表示圖形的顯示區域,要求圖形在指定的范圍內有效,不重新計算新的坐標值,自動實現超出部分不顯示。實現方法是:

/**
 * 限制圖形在指定區域內的顯示,超出部分不顯示。多個限制區有覆蓋時,得到限制區域的交集區域。
 */
public abstract void clipRect(int x, int y, int width, int height)

例如,代碼:

g.clipRect(0,0,100,50);
g.clipRect(50,25,100,50);

相當於

g.clipRect(50,25,50,25);

10. 復制圖形

利用Graphics類的方法copyArea()可以實現圖形的復制,其使用格式是:

/**
 * dx和dy分別表示將圖形粘貼到原位置偏移的像素點數,
 * 正值為往右或往下偏移是,負值為往左或往上偏移量。
 * 位移的參考點是要復制矩形的左上角坐標。
 */
public abstract void copyArea(int x, int y, int width, int height, int dx, int dy)

例如,以下代碼示意圖形的復制,將一個矩形的一部分、另一個矩形的全部分別自制。

g.drawRect(10,10,60,90);

g.fillRect(90,10,60,90);

g.copyArea(40,50,60,70,-20,80);

g.copyArea(110,50,60,60,10,80);

完整示例:

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;

import javax.swing.JFrame;

/**
 * 使用Graphics類繪圖
 * 
 * @author
 *
 */
public class GraphicsDemo extends JFrame {

    public GraphicsDemo() {
        setSize(1000, 600);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
    }

    @Override
    public void paint(Graphics g) {
        g.setColor(Color.RED);
        // 畫線段
        g.drawLine(5, 5, 20, 100);
        // 畫點
        g.drawLine(20, 20, 20, 20);

        // 畫普通矩形框
        g.drawRect(30, 5, 100, 100);
        // 填充普通矩形
        g.fillRect(140, 5, 100, 100);

        // 畫圓角矩形
        g.drawRoundRect(250, 5, 100, 100, 30, 30);
        // 填充圓角矩形
        g.fillRoundRect(360, 5, 100, 100, 40, 40);

        // 畫三維矩形
        g.draw3DRect(5, 110, 100, 100, false);
        // 填充三維矩形
        g.fill3DRect(110, 110, 100, 100, true);

        // 畫橢圓形
        g.drawOval(220, 110, 100, 50);
        // 填充橢圓形
        g.fillOval(330, 110, 30, 90);

        // 畫圓弧
        g.drawArc(5, 220, 100, 100, 30, 150);
        // 填充圓弧
        g.fillArc(110, 220, 100, 100, 70, 220);

        // 畫多邊形
        int px[] = { 210, 220, 270, 250, 240 };
        int py[] = { 220, 250, 300, 270, 220 };
        g.drawPolygon(px, py, px.length);
        // 填充多邊形
        int px1[] = { 310, 320, 370, 400, 340 };
        int py1[] = { 220, 250, 300, 270, 220 };
        g.fillPolygon(px1, py1, px.length);

        // 擦除塊
        g.setColor(Color.BLUE);
        g.fillOval(5, 330, 100, 100);
        g.clearRect(30, 350, 30, 60);

        // 限定圖形顯示區域
        g.clipRect(130, 380, 60, 60);
        g.clipRect(150, 400, 50, 50);
        g.fillRect(110, 330, 100, 100);
        g.setClip(null);

        // 繪制字符串
        g.setColor(Color.GREEN);
        g.setFont(new Font("楷體", Font.BOLD, 20));
        g.drawString("使用畫筆繪制的字符串內容", 220, 345);

        // 繪制圖像
        Image img = Toolkit.getDefaultToolkit().getImage("img/monster.gif");
        g.drawImage(img, 510, 5, 200, 200, Color.LIGHT_GRAY, this);

        // 復制圖形
        g.copyArea(0, 0, 500, 500, 505, 205);
    }

    public static void main(String[] args) {
        new GraphicsDemo().setVisible(true);
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM