前言:
這是我接觸Java 2D繪圖時,所做的一些學習筆記,內容上主要以程式實作的方法為主。而對於在繪圖元件背後的種種詳細運作流程與機制,則待日後再做說明。
另外,Java 2D 繪圖是在視窗程式上進行的,因此最好對AWT或Swing要有基本的認識。還有,AWT與Swing的繪圖方法與技巧在許多方面是不太一樣的,這點也必須注意。

一、起步
●AWT
請寫一個自訂類別,繼承Canvas類別 然後覆寫paint(Graphics g)這個methed。
簡單的AWT繪圖範例如下:

import java.awt.*;
import java.awt.event.*;
public class MyCanvasDemo_1 extends Canvas {
public MyCanvasDemo_1() {
//設定Canvas元件大小
setSize(640,480);
}

public void paint(Graphics g) {
//畫一條直線,從座標(100,100)到(150,150)
g.drawLine(100,100,150,150);
}

public static void main(String[] args) {
Frame frame = new Frame("MyCanvasDemo_1");
frame.add(new MyCanvasDemo_1());

//設定視窗顯示在螢幕在的位置
frame.setLocation(100,100);

//讓視窗右上角的X圖示被按下之後,視窗會關閉
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});

frame.pack();
frame.setVisible(true);
}
}



●Swing
請寫一個自訂類別,繼承JComponent類別,然後覆寫paintComponent(Graphics g)這個method。
簡單的Swing繪圖範例如下:

import javax.swing.*;
import java.awt.*;
public class MyCanvasDemo_2 extends JComponent {
public MyCanvasDemo_2() {

}

public void paintComponent(Graphics g) {
super.paintComponent(g);

//畫一條直線,從座標(100,100)到(150,150)
g.drawLine(100,100,150,150);
}

//實做自訂元件時,
//最好覆寫這getPreferredSize、getMaximumSize、getMinimumSize三個方法
//因為許多LayoutManager都可能由這三個方法來決定此物件的大小
public Dimension getPreferredSize() {
return new Dimension(640, 480);
}

public Dimension getMaximumSize() {
return getPreferredSize();
}

public Dimension getMinimumSize() {
return getPreferredSize();
}

public static void main(String[] args) {
//設定視窗的外觀
JFrame.setDefaultLookAndFeelDecorated(true);


JFrame frame = new JFrame("MyCanvasDemo_2");

//在Swing的JFrame元件中,
//要增加元件或是設定LayoutManager等動作,
//要間接透過getContentPane()方法取得RootPane,
//才能在上面進行動作。
frame.getContentPane().add(new MyCanvasDemo_2());
frame.getContentPane().setBackground(Color.WHITE);

//設定視窗顯示在螢幕在的位置
frame.setLocation(100,100);

//讓視窗右上角的X圖示被按下之後,視窗會關閉
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.pack();
frame.setVisible(true);
}
}



二、使用Graphics物件提供的method來進行繪圖
由以上兩個範例中,可以看到AWT的paint( )方法與Swing的paintConponent( )方法中,
有一行畫線的方法

g.drawLine(100,100,50,50);

它藉由Graphics物件的方法達成。以下說明如何使用Graphics物件。

●畫線

public void drawLine(int x1, int y1, int x2, int y2)

此method能繪出一條由座標(x1,y1)到(x2,y2)的直線。

[例]畫出一條由(100,120)到(150,180)的直線:

g.drawLine(100,120,150,180);


●畫矩形

public void drawRect(int x, int y, int width, int height)
public void fillRect(int x, int y, int width, int height)

drawRect( )方法能繪出一個左上角座標位於(x,y),長為width,寬為height的矩形。
參考下圖:

[例]畫出一個由(100,100)到(150,150)的矩形:

g.drawRect(100,100,50,50);

drawRect( )方法繪出的矩型只有邊線,如果想要繪製一個實心的矩型,
可以使用fillRect( )方法,用法跟drawRect( )是一樣的。


●畫圓角矩形

public void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)
public void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)

前四個參數與畫矩形時相同,而最後兩個參數決定圓角的長度與寬度,如下圖:


●畫3D矩形

public void draw3DRect(int x, int y, int width, int height, boolean raised)
public void fill3DRect(int x, int y, int width, int height, boolean raised)

draw3DRect( ) 可以畫出具有立體感的3D矩形
前四個參數與畫矩形時相同,而最後一個boolean參數決定3D矩形是浮起還是凹陷。


●畫橢圓

public void drawOval(int x, int y, int width, int height)
public void fillOval(int x, int y, int width, int height)

在Graphics類別中其實沒有真正畫圓的工具,
所以我們不是藉由定義它的圓心、半徑來繪製,
而是間接以矩形為框架,參考下圖:

[例]畫出一個圓心在(120,140),半徑50的正圓。(可以自己思考一下要怎麼換算):

g.drawOval(70,90,100,100);

跟矩型一樣,如果想要繪製一個實心的圓型,則使用fillOval( )方法就可以了。


●畫弧線

public void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle)
public void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle)

drawArc( )用來畫弧線,前4個參數跟畫圓一樣,而多了最後兩個參數,決定顯示的弧度。
startAngle弧度的起始角度,arcAngle是弧度的角度大小。

而fillArc( )方法則會畫出一片扇形。


●畫多邊形

public void drawPolygon(int[] xPoints, int[] yPoints, int nPoints)
public void drawPolygon(Polygon p)
public void fillPolygon(int[] xPoints, int[] yPoints, int nPoints)
public void fillPolygon(Polygon p)

畫出多邊形有兩種方法:
第一種是以xPoints陣列表示多邊形的所有端點的X座標值;
yPoints陣列表示所有端點的Y座標值;nPoints表示共有幾個點。然後即可直接繪圖。
第二種是建立Polygon物件,然後使用addPoint( )方法將多邊形各點逐步加入Polygon物件中。

public void addPoint(int x, int y)

之後即可以將Polygon物件做為參數丟給drawPolygon( )方法。
而fill與其他形狀一樣可以填滿顏色。


●設定繪圖顏色

public void setColor(Color c)

設定顏色需要使用到Color物件,你可以直接使用類別成員取得指定顏色的Color物件,
如Color.RED、Color.GREEN、Color.BLUE......等等。
關於其他顏色的資訊,可以查詢Java官方網站API手冊(1.5.0)

[例]設定繪圖顏色為紅色(使用類別成員取得Color物件)

g.setColor(Color.RED);

另一種方法,則是使用Color類別的建構子(Construct)來產生物件。
Color有幾種常用的建構子

public Color(float r, float g, float b)
public Color(float r, float g, float b, float a)
public Color(int r, int g, int b)
public Color(int r, int g, int b, int a)

r表示紅色;g表示綠色;b表示藍色;a表示alpha值(透明度),數字越小表示越透明。
當參數資料型態為float時,可接受的數值範圍為0.0 ~ 1.0;
當參數資料型態為int時,可接受的數值範圍為0 ~ 255;

[例]設定繪圖顏色為紅色且設alpha值為150使其成為半透明(使用Color的建構子來產生物件)

g.setColor(new Color(255,0,0,150));

arrow
arrow
    全站熱搜

    MylesLittleWolf 發表在 痞客邦 留言(3) 人氣()