JavaのdrawLineメソッドについてまとめています。JavaのSwingで作成した画面に直線、点線、色変更、曲線、自由に線を引くなど、多数のサンプルコードがあります。
JavaのdrawLineメソッドとは、AppletやSwingで作成した画面上に線を引くことのできるメソッドです。
drawLineメソッドは、java.awt.Graphicsクラスにあるメソッドです。 abstract(抽象)メソッドで、始点(x1,y1)と終点(x2,y2)を決めてその間に線を引くことが出来ます。
色は現在使用している色がつきます。現在の色を変更すれば色も変更出来ます。 マウスのイベントと合わせるとペイントツールのように自由に線や曲線が描画できます。
以下では、JavaのSwingで作成した画面に直線、点線、色変更、曲線、自由に線を引くなど、多数のサンプルコードを示しながら使い方を紹介しています。
サンプルコードの概要です。 ページをスクロールすればたどり着けますが、以下のページ内のリンクもご活用いただけます。
以下は、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メソッドで引く直線を複数回に分けて、線を引く、線を引かない、線を引く・・・を繰り返せば点線になります。
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メソッドで引く線を少しずらして線を引くと太線が引けます。 同じ要領で二重線などもできますので試して見るのもいいかもしれません。
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メソッドで引く線の色は、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メソッドで正方形の線を引くサンプルコードです。
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メソッドで曲線を引くサンプルコードです。
ループ処理を使用して、曲線を引くことも簡単にできます。
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メソッドで自由な位置に線を引くサンプルコードです。
イベント処理と合わせれば動的に線を引くことができます。 ここでは、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メソッドで前の線を残して自由な位置に線を引くサンプルコードです。
上のサンプルでは、再度線を引くと以前の線が消えてしまいました。 今回は以前の線を保存して最描画するようにしてみました。
なお、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で実行すると次のようになります。
前回までの知識と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で実行すると次のようになります。
あとは、メニューをつくって、線の種類や色を切り替える機能を追加したり、jpgに保存する機能が追加できたら、ペイントツールっぽくなっていきますね。
もっと知識を広げるための参考です。
GUI作成のための標準ライブラリ。同じソースで各種OSで動作する。JavaのSwingとは何かについてまとめています。
Javaとは?から言語の枠を超えるところまで、Java言語についてまとめています。
スポンサーリンク
サイト内のページ
言語
C・C++
/HTML
/Java
/JavaScript
/PHP
/シェルスクリプト
開発環境
Ant
/Burp
/Eclipse
/Fiddler
/gcc
/gdb
/Git
/g++
/JDK
/JMeter
/JUnit
/Teraterm
/ZAP
技術・仕様
Ajax
/CORBA
/Jakarta EE(旧称J2EE、Java EE)
/JNI
ライブラリ/Framework/CMS
bootstrap
/jQuery
/FuelPHP
/Lucene
/MyBatis
/Seasar2
/Spring
/Struts
/WordPress
Web API
Google Maps
ITインフラ
OSとミドルウェア
Linux
/Windows
/シェル
ActiveMQ
/Tomcat
/MariaDB
/MySQL
/Nagios
/Redis
/Solr
ITインフラ
セキュリティ
公開サーバーのセキュリティ
SI
ホームページの作り方
スポンサーリンク
IPアドレス確認ツール
あなたのグローバルIPアドレスは以下です。
216.73.216.131
HTMLの表示色確認ツール
パスワード生成ツール
文字数のプルダウンを選択して、取得ボタンを押すと「a~z、A~Z、0~9」の文字を ランダムに組み合わせた文字列が表示されます。
ここに生成されます。
スポンサーリンク
Copyright (C) 2007-2024 zealseeds. All Rights Reserved.