• 検索結果がありません。

以下に java.awt.graphics クラスの主なメソッドを示す (Graphics クラスの ) メソッド drawline(int x1, int y1, int x2, int y2) drawrect(int x, int y, int width, int height) fillr

N/A
N/A
Protected

Academic year: 2021

シェア "以下に java.awt.graphics クラスの主なメソッドを示す (Graphics クラスの ) メソッド drawline(int x1, int y1, int x2, int y2) drawrect(int x, int y, int width, int height) fillr"

Copied!
8
0
0

読み込み中.... (全文を見る)

全文

(1)

5章 グラフィックス,スレッドとマウスイベントによる描画処理

描画処理およびマルチスレッドの基礎についてそれぞれ理解し,Java を用いてイベント処理を 組み合わせたプログラムを作成する。 5.1 描画処理 最初に,パネル上にグラフィックス描画を行う方法について説明する。 グラフィックスを表示するにはフレームにパネルを配置し,処理内容を paintComponent メソッド 内に記述する。paintComponent メソッドは java.awt.Graphics クラスのオブジェクト g に対して,グラ フィックスメソッド(drawLine は線,drawRect は四角,など)を使用する。 グラフィック処理は座標(ピクセル)による指定で行われる。パネルの座標原点はタイトルバー 下(枠内)の左上隅となり,x 座標(水平)右方向,y 座標(垂直)下方向がそれぞれ+となる。

public void paintComponent(Graphics g){ super.paintComponent(g);

g.drawLine(0, 0, 200, 200); // グラフィック処理を記述 }

(2)

以下にjava.awt.Graphics クラスの主なメソッドを示す。

(Graphics クラスの)メソッド 説明

void

drawLine(int x1, int y1, int x2, int y2)

直線を描く (x は水平方向,y は垂直方向) (x1, y1) … 始点の座標

(x2, y2) … 終点の座標 void

drawRect(int x, int y, int width, int height)

矩形(四角)の輪郭を描く

(x, y) … 矩形の左上隅の座標 width … 矩形の幅

height … 矩形の高さ void

fillRect(int x, int y, int width, int height)

矩形(四角)を塗りつぶして描く ※ 引数は上記と同様。 void

clearRect(int x, int y, int width, int height)

矩形(四角)を(現在の描画表面の) バックグラウンドカラーで塗りつぶして消す

※ 引数は上記と同様。 void

drawRoundRect(int x, int y,

int width, int height, int arcWidth, int arcHeight)

丸いコーナー付きの 矩形(角丸四角)の輪郭を描く (x, y) … 矩形の左上隅の座標 width … 矩形の幅 height … 矩形の高さ arcWidth … 4 隅の弧の水平方向の直径 arcHeight … 4 隅の弧の垂直方向の直径 void fillRoundRect(int x, int y,

int width, int height, int arcWidth, int arcHeight)

丸いコーナー付きの

矩形(角丸四角)を塗りつぶして描く ※ 引数は上記と同様。

void

drawOval(int x, int y, int width, int height)

楕円の輪郭を描く

(x, y) … 楕円の左上隅の座標 width … 楕円の幅

height … 楕円の高さ void

fillOval(int x, int y, int width, int height)

楕円を塗りつぶして描く ※ 引数は上記と同様。 Color getColor() 現在の色を java.awt.Color クラスのオブジェクトで返す void setColor(Color c) 現在の色を java.awt.Color クラスのオブジェクト(引数) で指定された色に設定

(3)

また,java.awt.Color クラスでは下表のような基本色がフィールドで定義されており,java.awt. Graphics クラスのオブジェクトにおいて描画色を設定することができる(ちなみに初期状態は black である)。 フィールド名 説明(色) black 黒 cyan シアン gray グレイ lightGray ライトグレイ orange オレンジ red yellow blue darkGray ダークグレイ green magenta マゼンタ pink ピンク white さらに,この java.awt.Color クラスにはいくつかのコンストラクタが定義されているが,その代表 的なものを下表に示す。 コンストラクタ 説明 Color(int rgb) ビット16~23 の R 部分, ビット8~15 の G 部分, ビット0~7 の B 部分 より合成されたRGB 値を使って, 不透明なsRGB カラーを生成

Color(int r, int g, int b) 0~255 の範囲で指定された R,G,B の値を使って, 不透明なsRGB カラーを生成

Color(int r, int g, int b, int a) 0~255 の範囲で指定された R,G,B の値,および アルファ値を使って,

(4)

5.1.1 描画の色指定 java.awt.Color クラスで色を生成する場合,前述の通り色を表す定数を指定する方法以外に RGB 法による red,green,bule の各成分を 0~255 の値で指定する方法がある。 RGB 値 (16 進表記) (R, G, B) (10 進表記) 説明 (色) 00 00 00 (0, 0, 0) 黒 ff ff ff (255, 255, 255) 白 ff 00 00 (255, 0, 0) 赤 00 ff ff (0, 255, 255) シアン 00 ff 00 (0, 255, 0) ライム ff 00 ff (255, 0, 255) マゼンタ 00 00 ff (0, 0, 255) 青 ff ff 00 (255, 255, 0) 黄 ※ 詳細は,前章(第4 章)を参照のこと。

(5)

5.2 スレッド処理 スレッド(thread)とは,プログラムにおける処理の流れの単位のことを示す。 このスレッド処理が複数並行しておこなわれるとき,実際に働いているのは1 つのプログラムで あるが,複数のプログラムが動いているかのように異なる処理を同時に行う処理をおこなっている。 これをマルチスレッド処理という。 スレッド状態 (state) 説明 新規状態 new 演算子などによって生成された状態。 実行開始は start メソッドを呼び出す。 実行可能状態 start メソッドが呼び出されると実行可能状態となる。 スレッドの実行順序は,OS に任される。 ブロック状態 スレッドを一時停止したり,スレッドが何かに対して待機すると, スレッドは待機状態となる。 終了状態 スレッドのrun メソッドが最後まで実行され,正常終了した場合, または,途中で何らかのエラーによって異常終了した場合には, スレッドは終了状態となる。 このようなスレッドの機能を実現する元のインタフェースはRunnable であり,インスタンスを 1 つ のメソッドで実行するすべてのクラスには,このインタフェースの実装が必要である。 Runnable の中には run というメソッド(引数は無し)が定義されている。これはスレッドを実行する ために必要であり,この中にアクティブな処理を追加する。

このRunnable を実装した Java API のクラスとして,Thread がある(Runnable のサブクラスでは ない)。

Thread では run が呼び出せる他,その run を呼び出してスレッドの実行を開始する start,実行 中のスレッドを指定された引数の時間(ミリ秒)で中断させるsleep といったメソッドが使用できる。

(6)

5.2.1 再描画処理 前述の通り,スレッドではrun メソッドの中でアクティブな処理を追加することができるが,この中 で , 既 に 描 画 さ れ た 結 果 を そ の 処 理 後 の 結 果 で 再 描 画 す る た め の メ ソ ッ ド と し て , java.awt.Component クラス(もしくは javax.swing.JComponent クラス,すなわちこれまでの演習でも 使用していたJPanel のスーパークラス)の中に定義された repaint が使用できる。 メソッド 概要および記述 repaint() コンポーネント(全体)を再びペイント

repaint(int x, int y, int width, int height) コンポーネントの指定された場所の矩形領域を 再びペイント

(7)

5.3 マウスのイベント処理 javax.swing コンポーネントにおけるマウスイベント処理は,書式が下のようになり,次項に示す クラス・メソッドを用いておこなう。 イベント処理 (書式例) add イベントリスナークラス名(new アダプタークラス名()){ public void イベント処理メソッド名(イベントクラス名 e){ // イベント処理の内容 } } 各イベント処理メソッドで使用する引数(e)には,MouseEvent クラスのオブジェクトを使用する。 このクラスで使用できるメソッドgetX,getY により,イベントが発生した位置の x(幅方向),y(高さ 方向)の各座標をそれぞれ,発生元のコンポーネントに対する相対位置で返すことができる。

(例) int x = e.getX(); int y = e.getY();

これら(イベントの種類)をまとめると,下記の表のようになる。 イベント クラス名 イベントリスナー クラス名 アダプター クラス名 イベント処理 メソッド名 MouseEvent MouseListener (クリック系イベント用) MouseAdapter mouseClicked mouseEntered mouseExited mousePressed mouseReleased MouseMotionListener (ドラッグ系イベント用) MouseMotionAdapter mouseDragged mouseMoved

(8)

上記の各イベントに対する書式例は以下のようになる(各イベントとも,すべてのメソッドの記述 が空の場合であれ必要にある)。 イベント処理 書式例 MouseListener (クリック系イベント用) public class クラス名

extends JFrame implements MouseListener{

// JFrame クラスに MouseListener クラスの機能を提供 addMouseListener(this);

public void mouseClicked(MouseEvent e){ // マウスクリック(押してから離す)時の処理 }

public void mouseEntered(MouseEvent e){ // マウスコンポーネントに入った時の処理 }

public void mouseExited(MouseEvent e){ // マウスコンポーネントから出た時の処理 }

public void mousePressed(MouseEvent e){ // マウスプレス(押し続ける)時の処理 }

public void mouseReleased(MouseEvent e){ // マウスのボタンを離した時の処理 } } MouseMotionListener (ドラッグ系イベント用) public class クラス名

extends JFrame implements MouseMotionListener{

// JFrame クラスに MouseMotionListener クラスの機能を提供 addMouseMotionListener(this);

public void mouseDragged(MouseEvent e){ // ドラッグ操作時の処理

}

public void mouseMoved(MouseEvent e){ // ムーブ操作時の処理

} }

参照

関連したドキュメント

What relates to Offline Turing Machines in the same way that functional programming languages relate to Turing Machines?.. Int Construction.. Understand the transition from

名刺の裏面に、個人用携帯電話番号、会社ロゴなどの重要な情

注:一般品についての機種型名は、その部品が最初に使用された機種型名を示します。

(a) 主催者は、以下を行う、または試みるすべての個人を失格とし、その参加を禁じる権利を留保しま す。(i)

[3] Chari, Vyjayanthi, On the fermionic formula and the Kirillov-Reshetikhin conjecture, Int. and Yamada, Y., Remarks on fermionic formula, Contemp. and Tsuboi, Z., Paths, crystals

本時は、「どのクラスが一番、テスト前の学習を頑張ったか」という課題を解決する際、その判断の根

Tsouli, Infinitely many solutions for nonlocal elliptic p-Kirchhoff type equation under Neumann boundary condition, Int. Journal

[r]