java-beginner.com ブログ

プログラミングを学習するブログ(Javaをメインに)

Swingで描画する

投稿日:

最終更新日:2016年11月07日

アイキャッチ

こんにちは。

JavaにはSwingと呼ばれるGUIライブラリが用意されています。JFrameクラスでウィンドウを描画できることができます。今回は表示したウィンドウに文字列や図形を描画する処理を確認しました。

雛形

雛形となるプログラムは以下です。

ソース

import java.awt.Graphics;

import javax.swing.JFrame;

public class Test extends JFrame {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(350, 250);
        setVisible(true);
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        Graphics graphics = getContentPane().getGraphics();

        // 描画処理

    }

}

JFrameにはgetContentPane()メソッドがあります。API仕様書によると、contentPaneオブジェクトというものを取得することが可能です。このメソッドの返却値自体はContainerクラスで定義されてます。このクラスはjava.awt.Componentから継承されたメソッドのひとつとしてgetGraphicsを持ちます。このメソッドのGraphicsオブジェクトのメソッドを使うことでフレームのタイトルバーを除いた部分に描画をすることができます。

雛形のソースで「// 描画処理」の箇所にはgraphics.[描画メソッド]の形式で描画処理を記述します。

描画の際に使われる座標は左上が原点(0, 0)です。X軸は左から右へ増加、Y軸は上から下へ増加するという座標系です。

文字列の描画

文字列”Hello.”を描画したい場合、graphics#drawStringメソッドを使います。引数は(String str, int x, int y)です。それぞれの役割は以下です。

引数 役割
str 描画される文字列。
x 描画領域左下のx座標。
y 描画領域左下のy座標。

例えば、以下のように記述します。

ソース

graphics.drawString("Hello.", 10, 30);

点(10, 30)を描画領域の左下にして文字列”Hello.”が描画されます。

swing_day002001_drawstring

直線の描画

ここでは以下のメソッドを紹介します。

  • drawLine(int x1, int y1, int x2, int y2)
  • drawPolyline(int[] xPoints, int[] yPoints, int nPoints)
  • drawPolygon(int[] xPoints, int[] yPoints, int nPoints)

drawLineは2点を結ぶ線分を描画します。引数で2点(x1, y1)、(x2, y2)を指定します。線分とは2点を結ぶ直線の2点間の部分です。

drawPolylineは引数に指定した座標で線分を引きます。xPointsとyPointsは要素の数が同じ必要があります。nPointsはそれらの要素数です。nPointsが2以上の場合、2点(xPoints[i-1], yPoints[i-1])と(xPoints[i], yPoints[i])を結ぶ線分を描画します。ここで、iは1からnPoints-1の自然数です。

drawPolygonは引数の指定の方法はdrawPolylineと同じですが、配列が表す最後の点と最初の点を結ぶ直線も描画されます。

例えば、以下のように使います。

ソース

graphics.drawString("drawLine", 10, 30);
graphics.drawLine(10, 150, 30, 50);

int[] xPoints1 = { 80, 120, 160 };
int[] yPoints1 = { 150, 50, 150 };
graphics.drawString("drawPolyline", 80, 30);
graphics.drawPolyline(xPoints1, yPoints1, xPoints1.length);

int[] xPoints2 = { 180, 220, 260 };
int[] yPoints2 = { 150, 50, 150 };
graphics.drawString("drawPolygon", 180, 30);
graphics.drawPolygon(xPoints2, yPoints2, xPoints2.length);
swing_day002002_drawline

drawPolygonに対応してfillPolygonというメソッドがあります。閉じた多角形を塗りつぶします。

図形の輪郭の描画

ここでは以下のメソッドを紹介します。

  • drawRect(int x, int y, int width, int height)
  • drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)
  • drawOval(int x, int y, int width, int height)
  • drawArc(int x, int y, int width, int height, int startAngle, int arcAngle)

drawRectは第1第2引数で左上の点(x, y)を指定します。残りの引数で横と縦の幅を指定します。drawRoundRectはさらにarcWidthとarcHeightで4隅にある弧の水平方向の直径と垂直方向の直径を指定します。

drawOvalの場合、描画される図形が楕円になります。drawArcではstartAngleとarcAngleを指定することにより弧を描画することができます。

例えば以下のように使います。

ソース

graphics.drawString("drawRect", 10, 30);
graphics.drawRect(20, 50, 40, 100);

graphics.drawString("drawRoundRect", 70, 30);
graphics.drawRoundRect(100, 50, 40, 100, 40, 20);

graphics.drawString("drawOval", 180, 30);
graphics.drawOval(190, 50, 40, 100);

graphics.drawString("drawArc", 250, 30);
graphics.drawArc(260, 50, 40, 100, 30, 250);
swing_day002003_drawrect

上記のメソッドそれぞれに対して、図形を塗りつぶすメソッドfillRect、fillRoundRect、fillOval、fillArcがあります。

その他

API仕様書を見ると他にもメソッドがあります。例えば画像を描画するdrawImageメソッドがあります。

以上です。参考になれば幸いです。