トップ 言語 Java クラスライブラリ drawLineメソッド

JavaのdrawLineメソッド―Swing画面に直線、点線、色変更、曲線、自由に線を引く

JavaのdrawLineメソッドについてまとめています。JavaのSwingで作成した画面に直線、点線、色変更、曲線、自由に線を引くなど、多数のサンプルコードがあります。

drawLineメソッドとは

JavaのdrawLineメソッドとは、AppletやSwingで作成した画面上に線を引くことのできるメソッドです。

drawLineメソッドは、java.awt.Graphicsクラスにあるメソッドです。 abstract(抽象)メソッドで、始点(x1,y1)と終点(x2,y2)を決めてその間に線を引くことが出来ます。

色は現在使用している色がつきます。現在の色を変更すれば色も変更出来ます。 マウスのイベントと合わせるとペイントツールのように自由に線や曲線が描画できます。

以下では、JavaのSwingで作成した画面に直線、点線、色変更、曲線、自由に線を引くなど、多数のサンプルコードを示しながら使い方を紹介しています。

サンプルコードの一覧

サンプルコードの概要です。 ページをスクロールすればたどり着けますが、以下のページ内のリンクもご活用いただけます。

drawLineメソッドで直線を引く

以下は、Swingで作成した画面にdrawLineメソッド利用して直線を引くサンプルコードです。

サンプルコード

Swingの画面の位置の座標は、普通のグラフの逆でXは右方向に、Yは下方向に伸びているイメージとなります。 サンプルでは、線の開始位置をstartX, startY、終了位置をendX, endYというint型の値で設定しています。

import java.awt.Graphics;
import javax.swing.JFrame;

public class Sample1 extends JFrame {

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

	Sample1(){
		int appWidth = 300;
		int appHeight = 200;
 		setSize(appWidth, appHeight);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
	}

	@Override
	public void paint(Graphics g) {
		super.paint(g);
		paintLine(g);
	}

	void paintLine(Graphics g) {
		int startX = 50;
		int startY = 100;
		int endX = startX + 200;
		int endY = startY + 0;
		g.drawLine(startX, startY, endX, endY);
	}
}

実行結果

javac Sample1.javaでコンパイルして、java Sample1で実行すると次のようになります。

Swingで作成した画面にdrawLineメソッドで直線を引く

サンプルコードの一覧へ

drawLineメソッドで点線を引く

以下は、Swingで作成した画面にdrawLineメソッドで点線を引くサンプルコードです。

サンプルコード

drawLineメソッドで引く直線を複数回に分けて、線を引く、線を引かない、線を引く・・・を繰り返せば点線になります。

import java.awt.Graphics;
import javax.swing.JFrame;

public class Sample2 extends JFrame {

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

	Sample2(){
		int appWidth = 300;
		int appHeight = 200;
 		setSize(appWidth, appHeight);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
	}

	@Override
	public void paint(Graphics g) {
		super.paint(g);
		paintDotLine(g);
	}

	void paintDotLine(Graphics g) {
		int startX = 50;
		int startY = 100;
		int endX = startX + 5;
		int endY = startY + 0;

		while(endX < 250) {
			g.drawLine(startX, startY, endX, endY);
			startX = endX + 5;
			endX = startX + 5;
		}
	}
}

実行結果

javac Sample2.javaでコンパイルして、java Sample2で実行すると次のようになります。

Swingで作成した画面にdrawLineメソッドで点線を引く

サンプルコードの一覧へ

drawLineメソッドで太めの点線を引く

以下は、Swingで作成した画面にdrawLineメソッドで太めの点線を引くサンプルコードです。

サンプルコード

drawLineメソッドで引く線を少しずらして線を引くと太線が引けます。 同じ要領で二重線などもできますので試して見るのもいいかもしれません。

import java.awt.Graphics;
import javax.swing.JFrame;

public class Sample3 extends JFrame {

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

	Sample3(){
		int appWidth = 300;
		int appHeight = 200;
 		setSize(appWidth, appHeight);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
	}

	@Override
	public void paint(Graphics g) {
		super.paint(g);
		paintDotLine(g);
	}

	void paintDotLine(Graphics g) {
		int startX = 50;
		int startY = 100;
		int endX = startX + 5;
		int endY = startY + 0;

		while(endX < 250) {
			g.drawLine(startX, startY, endX, endY);
			g.drawLine(startX, startY+1, endX, endY+1);
			g.drawLine(startX, startY+2, endX, endY+2);
			g.drawLine(startX, startY+3, endX, endY+3);
			g.drawLine(startX, startY+4, endX, endY+4);
			g.drawLine(startX, startY+5, endX, endY+5);
			startX = endX + 5;
			endX = startX + 5;
		}
	}
}

実行結果

javac Sample3.javaでコンパイルして、java Sample3で実行すると次のようになります。

Swingで作成した画面にdrawLineメソッドで太めの点線を引く

サンプルコードの一覧へ

drawLineメソッドの線の色を変更して線を引く

以下は、Swingで作成した画面にdrawLineメソッドの線の色を変更して線を引くサンプルコードです。

サンプルコード

drawLineメソッドで引く線の色は、GraphicsクラスオブジェクトのsetColorメソッドで変更できます。 setColorメソッドの引数はColorクラスのオブジェクトになります。

色はRGBというRed、Green、Blueの組合せで複数の色を表現します。 同じようにColorクラスのコンストラクタの第1引数にRedの濃さ(0~255)、Greenの濃さ(0~255)、Blueの濃さ(0~255)を指定すれば好きな色が設定できます。

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;

public class Sample4 extends JFrame {

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

	Sample4(){
		int appWidth = 300;
		int appHeight = 200;
 		setSize(appWidth, appHeight);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
	}

	@Override
	public void paint(Graphics g) {
		super.paint(g);
		paintRedLine(g);
		paintGreenLine(g);
		paintBlueLine(g);
	}

	void paintRedLine(Graphics g) {
		Color c = new Color(255, 0, 0);
		g.setColor(c);
		int startX = 50;
		int startY = 50;
		int endX = startX + 200;
		int endY = startY + 0;
		g.drawLine(startX, startY, endX, endY);
	}

	void paintGreenLine(Graphics g) {
		Color c = new Color(0, 255, 0);
		g.setColor(c);
		int startX = 50;
		int startY = 100;
		int endX = startX + 200;
		int endY = startY + 0;
		g.drawLine(startX, startY, endX, endY);
	}

	void paintBlueLine(Graphics g) {
		Color c = new Color(0, 0, 255);
		g.setColor(c);
		int startX = 50;
		int startY = 150;
		int endX = startX + 200;
		int endY = startY + 0;
		g.drawLine(startX, startY, endX, endY);
	}
}

実行結果

javac Sample4.javaでコンパイルして、java Sample4で実行すると次のようになります。

Swingで作成した画面にdrawLineメソッドの線の色を変更して線を引く

サンプルコードの一覧へ

drawLineメソッドで正方形の線を引く

以下は、Swingで作成した画面にdrawLineメソッドで正方形の線を引くサンプルコードです。

サンプルコード

Swingの開始位置と終了位置の座標が頭に入ってくると、drawLineメソッドで正方形の線を引くのも簡単です。

import java.awt.Graphics;
import javax.swing.JFrame;

public class Sample5 extends JFrame {

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

	Sample5(){
		int appWidth = 300;
		int appHeight = 200;
 		setSize(appWidth, appHeight);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
	}

	@Override
	public void paint(Graphics g) {
		super.paint(g);
		paintSquare(g);
	}

	void paintSquare(Graphics g) {
		int startX = 125;
		int startY = 75;
		int endX = startX + 50;
		int endY = startY + 0;
		g.drawLine(startX, startY, endX, endY);

		startX = endX;
		startY = endY;
		endX = startX + 0;
		endY = startY + 50;
		g.drawLine(startX, startY, endX, endY);

		startX = endX;
		startY = endY;
		endX = startX + -50;
		endY = startY + 0;
		g.drawLine(startX, startY, endX, endY);

		startX = endX;
		startY = endY;
		endX = startX + 0;
		endY = startY + -50;
		g.drawLine(startX, startY, endX, endY);
	}
}

実行結果

javac Sample5.javaでコンパイルして、java Sample5で実行すると次のようになります。

Swingで作成した画面にdrawLineメソッドで正方形の線を引く

サンプルコードの一覧へ

drawLineメソッドで曲線を引く

以下は、Swingで作成した画面にdrawLineメソッドで曲線を引くサンプルコードです。

サンプルコード

ループ処理を使用して、曲線を引くことも簡単にできます。

import java.awt.Graphics;
import javax.swing.JFrame;

public class Sample6 extends JFrame {

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

	Sample6(){
		int appWidth = 300;
		int appHeight = 200;
 		setSize(appWidth, appHeight);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
	}

	@Override
	public void paint(Graphics g) {
		super.paint(g);
		paintCurvedLine(g);
	}

	void paintCurvedLine(Graphics g) {
		int baseX = 1;
		int baseY= 5;
		int startX = 50 + baseX;
		int startY = 50 + baseY;
		int endX = startX;
		int endY = startY;
		g.drawLine(startX, startY, endX, endY);

		for (int i = 0; i < 20; i++) {
			startX = endX;
			startY = endY;
			endX = startX + (baseX * i);
			endY = startY + baseY;
			g.drawLine(startX, startY, endX, endY);
		}
	}
}

実行結果

javac Sample6.javaでコンパイルして、java Sample6で実行すると次のようになります。

Swingで作成した画面にdrawLineメソッドで曲線を引く

サンプルコードの一覧へ

drawLineメソッドで自由な位置に線を引く

以下は、Swingで作成した画面にdrawLineメソッドで自由な位置に線を引くサンプルコードです。

サンプルコード

イベント処理と合わせれば動的に線を引くことができます。 ここでは、MouseListenerを使用して、マウスで押しながら位置を変更して離したところまで線を引くようにしてみます。

なお、Pointクラスという位置を表すクラスがありますのでPointクラスを使用してみました。

import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;

public class Sample7 extends JFrame implements MouseListener {
	Point start;
	Point end;
	boolean isDraw = false;

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

	Sample7(){
		int appWidth = 300;
		int appHeight = 200;
 		setSize(appWidth, appHeight);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
		addMouseListener(this);
	}

	@Override
	public void paint(Graphics g) {
		super.paint(g);
		paintFreeLine(g);
	}

	void paintFreeLine(Graphics g) {
		if (isDraw) {
			g.drawLine(start.x, start.y, end.x, end.y);
		}
	}

	@Override
	public void mouseClicked(MouseEvent e) {}

	@Override
	public void mousePressed(MouseEvent e) {
		isDraw = false;
		start = new Point(e.getX(), e.getY());
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		isDraw = true;
		end = new Point(e.getX(), e.getY());
		super.repaint();
	}

	@Override
	public void mouseEntered(MouseEvent e) {}

	@Override
	public void mouseExited(MouseEvent e) {}
}

実行結果

javac Sample7.javaでコンパイルして、java Sample7で実行すると次のようになります。

Swingで作成した画面にdrawLineメソッドで自由な位置に線を引く

このサンプルでは、もう一回線を引くと前の線が無くなってしまします。 前の線を無くさないようにするにはどうしたらよいのでしょうか? 前の状態を保持すればいいですね。次のサンプルでサンプルコードを紹介します。

サンプルコードの一覧へ

drawLineメソッドで前の線を残して自由な位置に線を引く

以下は、Swingで作成した画面にdrawLineメソッドで前の線を残して自由な位置に線を引くサンプルコードです。

サンプルコード

上のサンプルでは、再度線を引くと以前の線が消えてしまいました。 今回は以前の線を保存して最描画するようにしてみました。

なお、Pointクラスという位置を表すクラスがありますのでPointクラスを使用してみました。

import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;

public class Sample8 extends JFrame implements MouseListener {
	List<Point> startList = new ArrayList<>();
	List<Point> endList = new ArrayList<>();

	boolean isDraw = false;

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

	Sample8(){
		int appWidth = 300;
		int appHeight = 200;
 		setSize(appWidth, appHeight);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
		addMouseListener(this);
	}

	@Override
	public void paint(Graphics g) {
		super.paint(g);
		paintFreeLines(g);
	}

	void paintFreeLines(Graphics g) {
		if (isDraw) {
			for (int i = 0; i < endList.size(); i++) {
				Point start = startList.get(i);
				Point end = endList.get(i);
				g.drawLine(start.x, start.y, end.x, end.y);
			}
		}
	}

	@Override
	public void mouseClicked(MouseEvent e) {
	}

	@Override
	public void mousePressed(MouseEvent e) {
		isDraw = false;
		startList.add(new Point(e.getX(), e.getY()));
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		isDraw = true;
		endList.add(new Point(e.getX(), e.getY()));
		super.repaint();
	}

	@Override
	public void mouseEntered(MouseEvent e) {
	}

	@Override
	public void mouseExited(MouseEvent e) {
	}
}

実行結果

javac Sample8.javaでコンパイルして、java Sample8で実行すると次のようになります。

Swingで作成した画面にdrawLineメソッドで前の線を残して自由な位置に線を引く

サンプルコードの一覧へ

drawLineメソッドで前の線を残して自由曲線を引く

前回までの知識とMouseMotionListenerを使えば、自由に曲線を引くことができます。 ここまで来ると自由にお絵描きできますね。

サンプルコード

マウスが動くたびにその位置を記憶して線を引けばドット単位で引けるので曲がった線もちゃんと引けます。 一旦引いた線も保存しておけば、しばらく休憩してから続きの線が引けます。

import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;

public class Sample9 extends JFrame implements MouseListener, MouseMotionListener {
	List<List<Point>> pintsList = new ArrayList<>();
	List<Point> currentPoints = new ArrayList<>();

	boolean isDraw = false;

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

	Sample9(){
		int appWidth = 300;
		int appHeight = 200;
 		setSize(appWidth, appHeight);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
		addMouseListener(this);
		addMouseMotionListener(this);
	}

	@Override
	public void paint(Graphics g) {
		super.paint(g);
		paintFreeCurvedLines(g);
	}

	void paintFreeCurvedLines(Graphics g) {
		if (isDraw) {
			pintsList.add(currentPoints);
			for (List<Point> points : pintsList) {
				for (int i = 1; i < points.size(); i++) {
					Point start = points.get(i-1);
					Point end = points.get(i);
					g.drawLine(start.x, start.y, end.x, end.y);
				}
			}
			currentPoints = new ArrayList<>();
		}
	}

	void paintFreeLines(Graphics g, List<Point> points) {
	}

	@Override
	public void mouseClicked(MouseEvent e) {}

	@Override
	public void mousePressed(MouseEvent e) {
		isDraw = false;
		currentPoints.add(new Point(e.getX(), e.getY()));
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		isDraw = true;
		currentPoints.add(new Point(e.getX(), e.getY()));
		super.repaint();
	}

	@Override
	public void mouseEntered(MouseEvent e) {}

	@Override
	public void mouseExited(MouseEvent e) {}

	@Override
	public void mouseDragged(MouseEvent e) {
		currentPoints.add(new Point(e.getX(), e.getY()));
	}

	@Override
	public void mouseMoved(MouseEvent e) {}
}

実行結果

javac Sample9.javaでコンパイルして、java Sample9で実行すると次のようになります。

Swingで作成した画面にdrawLineメソッドで前の線を残して自由曲線を引く

あとは、メニューをつくって、線の種類や色を切り替える機能を追加したり、jpgに保存する機能が追加できたら、ペイントツールっぽくなっていきますね。

サンプルコードの一覧へ

もっと知識を広げるための参考

戻る

スポンサーリンク

サイト内のページ

言語
C・C++ /HTML /Java /JavaScript /PHP /シェルスクリプト

開発環境
Ant /Bcc /Eclipse /gcc /gdb /g++ /JDK /JUnit /ZAP

技術・仕様
Ajax /CORBA /Java EE(旧称J2EE) /JNI

ライブラリ/Framework/CMS
jQuery /Lucene /MyBatis /RESTEasy /Spring /Struts /Seasar2 /WordPress

ITインフラ OSとミドルウェア
Linux /Windows /シェル
Apache/Tomcat /MySQL /Redis /Solr /vsftpd

ITインフラ PC 製品
ZOTAC

ITインフラ サーバー
Web公開サーバー構築

ITインフラ ネットワーク
プログラミング /機器 /構築

ITインフラ セキュリティ
公開サーバーのセキュリティ

SI
ホームページの作り方 /小さな会社のISMS

その他
IT用語 /ITスキル体系 /トレンド履歴

スポンサーリンク