いろいろな描画

アプレットでいろいろな図形を描いてみましょう。

これは次のように書きました。

import java.awt.*;
import javax.swing.*;

public class Applet2 extends JApplet {

    // サンセリフの30ポイントのフォントを ss30 と名づける
    Font ss30 = new Font("SansSerif", Font.PLAIN, 30);

    // アプレットの初期化
    public void init() {
        MyPanel p = new MyPanel();
        p.setBackground(Color.white); // 背景色を白に
        setContentPane(p);
    }

    // 実際の描画
    class MyPanel extends JPanel {
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.blue);      // 色を青に
            g.drawLine(10, 30, 40, 10);  // 線分
            g.drawRect(50, 10, 30, 20);  // 長方形
            g.fillRect(90, 10, 30, 20);  // 長方形(塗りつぶし)
            g.drawOval(130, 10, 30, 20); // 楕円
            g.fillOval(170, 10, 30, 20); // 楕円(塗りつぶし)
            g.setColor(Color.red);       // 色を赤に
            g.setFont(ss30);
            g.drawString("ジャバJava!", 10, 90);
        }
    }
}

個々の描画メソッドをもうちょっと詳しく説明します。

setColor(色)
色を指定。 色指定の方法は Color.white のような名前を使う方法と new Color(r, g, b) のような RGB 成分を0〜255の整数で指定する方法などがあります
drawLine(x1, x2, y1, y2)
点 (x1, x2) と点 (y1, y2) を線分で結ぶ
drawRect(x, y, w, h)
点 (x, y) を左上隅とする幅 w,高さ h の長方形を描く
fillRect(x, y, w, h)
同上(塗りつぶし)
drawOval(x, y, w, h)
点 (x, y) を左上隅とする幅 w,高さ h の長方形に内接する楕円を描く
fillOval(x, y, w, h)
同上(塗りつぶし)
drawString("文字列", x, y)
点 (x, y) を左下隅とする長方形領域に文字列を描く

もう一つサンプルとして,ボタンを押すたびにランダムな数を画面に出す アプレットを作ってみましょう。

これは次のように書きました。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Y extends JApplet {
    int x = 1;                                   // 整数の変数 x を作る
    Font ss30 = new Font("SansSerif", Font.PLAIN, 30);  // フォント定義
    public void init() {
        Container c = getContentPane();
        JButton b = new JButton("押してね!");   // ボタンを作る
        MyPanel p = new MyPanel();               // パネルを作る
        c.add(b, BorderLayout.NORTH);            // ボタンを貼り付ける
        c.add(p, BorderLayout.CENTER);           // パネルを貼り付ける
        b.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) { // イベント処理
                    x = (int)(10 * Math.random()) + 1; // x に1〜10の乱数を入れる
                    repaint();                   // 再描画
                }
            });
    }
    class MyPanel extends JPanel {
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setFont(ss30);
            g.drawString(x + "", 140, 40);       // x を座標 (140,40) に書く
        }
    }
}

整数 x はそのままでは drawString() に渡せないので, 文字列に化けさせるテクニック x + "" を使っています。

次に,GIF ファイルを読み込んでみましょう。 これは松阪大学(現:三重中京大学)の1997年度前期コンピュータ演習受講者の落合朋子さんの作品です(Swing版に直しました)。 マウスをクリックしてください。ミノムシが増殖します(はずなのですが,環境によってうまくいきません)。

これは次のように書かれています。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Minomushi extends JApplet {
    Image image;
    int x = 70, y = 30;
    public void init() {
        MyPanel p = new MyPanel();
        p.setBackground(Color.white);
        setContentPane(p);
        p.addMouseListener(new MouseAdapter() {
                public void mousePressed(MouseEvent e) {
                    x = e.getX();
                    y = e.getY();
                    repaint();
                }
            });
        image = getImage(getDocumentBase(), "musi.gif");
    }
    class MyPanel extends JPanel {
        protected void paintComponent(Graphics g) {
            g.drawImage(image, x, y, this);
        }
    }
}

まず Image 型の変数 image を作っておき,それに getImage() メソッドで画像を読み込みます。 getImage() の使い方は,通常

    image = getImage(getDocumentBase(), "ファイル名");

の形で使います。この getDocumentBase() は,その HTML ファイルのあるディレクトリと同じ場所に画像ファイルがあることを示すことばです。 ここでは musi.gif という GIF ファイルを使っています。

paintComponent() メソッドで実際に絵を描きます。 絵を描く命令は g.drawImage(image, x, y, this) です。 これは,変数 image に入っている画像を,点 (x, y) を左上隅として描きます。 最後の this は,このコンポーネントに対して描くという意味の決まり文句です。

さらにマウスをクリックするとその場所にミノムシが増殖するように,paintComponentsuper.paintComponent を呼び出さないようにしたり,p.setOpaque(false); したりしてみているのですが,環境によってはうまくいかないようです。


奥村晴彦

Last modified: 2006-01-03 11:13:15