2009年5月31日日曜日

Java AWT 図形を描画する

AWTで図形を描画してみます。

AWTのコンポーネントの描画はすべてJavaで行われているわけではなく、WindowsであればWIN32APIを使用しているため、
ButtonクラスのpaintメソッドをオーバーライドしてもButtonのデザインを変更することはできません。
AWTではGUIの表示を変更することができません。
※Swingではすべての描画がJavaで行われいるので、GUIの表示を変更することが可能です。


AWTの描画の仕組みは、コンポーネントで再描画の要求があるとrepaint、Update、Paintの順に描画メソッドが呼び出されていきます。

FrameクラスのpaintメソッドをオーバーライドしてFrameに図形を描画してみます。
paintメソッドの引数Graphicsクラスには下記のような描画メソッドが用意されています。

drawRect(横位置, 縦位置, 横幅, 縦幅)枠線のみの四角を描画します。
fillRect(横位置, 縦位置, 横幅, 縦幅)塗りつぶした資格を描画します。
drawOval(横位置, 縦位置, 横幅, 縦幅)枠線のみの円を描画します。
fillOval(横位置, 縦位置, 横幅, 縦幅)塗りつぶした円を描画します。
drawLine(開始横位置,開始縦位置, 終了横位置, 終了縦位置)直線を描画します。
drawRoundRect(横位置, 縦位置, 横幅, 縦幅, 丸みの横幅, 丸みの縦幅)枠線のみの角が丸い四角を描画します。
fillRoundRect(横位置, 縦位置, 横幅, 縦幅, 丸みの横幅, 丸みの縦幅)塗りつぶした角が丸い四角を描画します。
draw3DRect(横位置, 縦位置, 横幅, 縦幅, boolean)枠線が立体的な四角を描画します。第5引数のboolean型には凸であればtrue。凹であればfalse。
drawArc(横位置, 縦位置, 横幅, 縦幅, 開始角度, 描画角度)円弧を描画します。開始角度、描画角度はは3時の位置を0として、反時計周りに算出した円弧の角度を指定します。
fillArc(横位置, 縦位置, 横幅, 縦幅, 開始角度, 描画角度)扇型を描画します。開始角度、描画角度はは3時の位置を0として、反時計周りに算出した円弧の角度を指定します。
drawPolyLine(int配列1, int配列2, int配列3)開いた多角形の線分を描画します。
drawPolygon(int配列1, int配列2, int配列3)
drawPolygon(Polygon)
閉じた多角形の線分を描画します。
fillPolygon(int配列1, int配列2, int配列3)
fillPolygon(polygon)
閉じた多角形を塗りつぶして描画します。



VisualEditorを利用してFrameを作成します。
ソースコードの「extends Frame」にカーソルを置いた状態で
eclipseメニューの「ソース」より「メソッドのオーバーライド/実装」を選択します。
起動した画面より「Container」の「paint(Graphics)」をチェックONにし「OK」ボタンをクリックします。



ソースコードのPaintメソッドに描画コードを記述します。
package graphicsSample;

import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Polygon;

public class GraphicsSample01 extends Frame {

private static final long serialVersionUID = 1L;
@Override
public void paint(Graphics g) {
// TODO 自動生成されたメソッド・スタブ
//super.paint(g);

g.setColor(Color.red);
//枠線のみの四角形を描画します。
g.drawRect(50,50,50,50);
//塗りつぶした四角形を描画します。
g.fillRect(120, 50, 50, 50);

g.setColor(Color.blue);
//枠線のみの円を描画します。
g.drawOval(50,120,50,50);
//塗りつぶした円を描画します。
g.fillOval(120, 120, 50, 50);

g.setColor(Color.black);
//直線を描画します。
g.drawLine(50, 190, 150, 190);

g.setColor(Color.orange);
//枠線のみの角の丸い四角を描画します。
g.drawRoundRect(50, 260, 50, 50, 20,20);
//塗りつぶした角の丸い四角を描画します。
g.fillRoundRect(120, 260, 50, 50, 20,20);

g.setColor(Color.lightGray);
//枠線が浮き出した四角を描画します。
g.fill3DRect(50, 330, 50, 50, true);
//枠線がへこんだ四角を描画します。
g.fill3DRect(120, 330, 50, 50, false);

g.setColor(Color.magenta );
//円弧を描画します。
g.drawArc(50, 400, 50, 50, 0, -90);
//扇型を描画します。
g.fillArc(120, 400, 50, 50, 0, -90);

g.setColor(Color.cyan);
//(50,470)、(100,520)、(150,470)、(200,520)の4点を結ぶ折れ線を描画します。
int p = 4;
int[] x = {50,100,150,200};
int[] y = {470,520,470,520};
g.drawPolyline(x, y, p);

//(50,590),(100,640),(150,590),(200,640)の4点を結ぶ多角形を描画します。
Polygon pol1 = new Polygon();
pol1.npoints = 4;
pol1.xpoints = new int[]{50,100,150,200};
pol1.ypoints = new int[]{590,640,590,640};
g.drawPolygon(pol1);

//(50,650),(100,700),(150,650),(200,700)の4点を結ぶ塗りつぶした多角形を描画します。
Polygon pol2 = new Polygon();
pol2.npoints = 4;
pol2.xpoints = new int[]{50,100,150,200};
pol2.ypoints = new int[]{590,640,590,640};
g.fillPolygon(pol2);
}

/**
* @param args
*/
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
new GraphicsSample01();
}

/**
* This is the default constructor
*/
public GraphicsSample01() {
super();
initialize();
}

/**
* This method initializes this
* 
* @return void
*/
private void initialize() {
this.setSize(300, 700);
this.setTitle("Frame");

this.setVisible(true);
}

}


0 件のコメント: