表示の更新もそういた作業のひとつに当たる スレッドの使用アニメーション アニメーションやシミュレーションなどは画面の更新が一定のタイミングで行われていく この連続した画面の更新をスレッドを利用して行う しかし paint() メソッドを直接呼び出して表示を更新することはできない その理由

Similar documents
Microsoft PowerPoint - OOP.pptx

Microsoft PowerPoint ppt


Microsoft PowerPoint ppt

Applet java.lang.object java.awt.component java.awt.container java.awt.panel java.applet.applet

アプレットⅤ

ガイダンス

ガイダンス

テキストエディタ ファイル 名.java クラス 名.html クラス 名.java 利 用 方 法 は2 通 り ファイル 名.html Java コンパイラ ( javac ) appletviewer (コンソール 上 ) あるいは WWW ブラウザ (Internet Explorer, N

アプレットの作成

Java演習(9) -- クラスとメソッド --

Microsoft PowerPoint prog1_doc2x.pptx

Microsoft PowerPoint prog1_doc2.pptx

< F2D92DE82E8914B82CC977088D32E6A7464>

< F2D82518CC282CC D2E6A7464>

< F2D F B834E2E6A7464>

< F2D825282CC947B909482CC A815B83682E6A>

Java言語 第1回

(Microsoft PowerPoint - \223\306\217KJAVA\221\346\202R\224\ ppt)

< F2D82B682E182F182AF82F12E6A7464>

19 3!! (+) (>) (++) (+=) for while 3.1!! (20, 20) (1)(Blocks1.java) import javax.swing.japplet; import java.awt.graphics;

< F2D B838A835882CC8CF68EAE2E6A7464>

< F2D834F838C A815B A CC>

r3.dvi

Java言語 第1回

< F2D8EA CE909482CC92EA82852E6A7464>

Microsoft PowerPoint - OOP.pptx

Microsoft PowerPoint - prog10.ppt

< F2D E E6A7464>

2008 e-learning T050050

JAVA入門

Java言語 第1回

try catch Exception Java try catch try { } catch ( Exception e ) { } e 16-1 try catch 0 try { int x = 0; int y = 10 / x; } catch ( Exception e ) { Sys

Java講座

Microsoft PowerPoint - prog10.ppt

Local variable x y i paint public class Sample extends Applet { public void paint( Graphics gc ) { int x, y;... int i=10 ; while ( i < 100 ) {... i +=

r2.dvi

教材ドットコムオリジナル教材 0から始めるiアフ リ リファレンス i アプリ簡易リファレンス ver i アプリ Java 独自のメソッド (1)iアプリの命令を使えるようにする import com.nttdocomo.ui.*; (2) 乱数を使う import java.u

Safari AppletViewer Web HTML Netscape Web Web 15-1 Applet Web Applet init Web paint Web start Web HTML stop destroy update init Web paint start Web up

Java講座

問題1 以下に示すプログラムは、次の処理をするプログラムである

PowerPoint プレゼンテーション

GUIプログラムⅣ

6 p.1 6 Java GUI GUI paintcomponent GUI mouseclicked, keypressed, actionperformed mouseclicked paintcomponent thread, 1 GUI 6.0.2, mutlithread C

< F2D89BA8EE882C E6A7464>

Java演習(2) -- 簡単なプログラム --

r4.dvi

PowerPoint プレゼンテーション

PowerPoint Presentation

< F2D B825082CC96E291E82E6A7464>

r8.dvi

シミュレーションの簡単な例 GUI 無しのシミュレーションを作る GUI を作る パラメタを設定するデモンストレーションをする 2 オブジェクト指向プログラミング特論

r6.dvi

< F2D BCA82CC978E89BA82CC8EC08CB12E6A7464>

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

10/31 Java AWTの基本構造(Frameクラスの継承) 演習課題資料

untitled

<4D F736F F F696E74202D AC C8899E D834F E >

Java演習(4) -- 変数と型 --

( ) p.1 x y y = ( x ) 1 γ γ = filtergamma.java import java.applet.*; public class filtergamma extends Applet{ Image img; Image new_img; publi

Programming-C-9.key

問1

JavaプログラミングⅠ

ただし 無作為にスレッドを複数実行すると 結果不正やデッドロックが起きる可能性がある 複数のスレッド ( マルチスレッド ) を安全に実行する ( スレッドセーフにする ) ためには 同期処理を用いるこ とが必要になる 同期処理は 予約語 synchronized で行うことができる ここでは sy

2

アプレットⅠ

9.3 同期 共有データへの読み書きの同期 複数のスレッドから共有データを読み書きするときに発生する問題について 一つのフィールドに対して複数のスレッドが同時にアクセスする可能性がある場合 その順番によっては整合性が保てなくなる可能性があるので スレッドの制御フローが独立していては困ることがある 次

2

Microsoft PowerPoint - prog11.ppt

< F2D82518E9F8AD CC834F CC8CFC82AB82C68D4C>

< F2D82518E9F8AD CC95BD8D7388DA93AE2E6A7464>

Microsoft PowerPoint - prog11.ppt

ガイダンス

2 p.2 2 Java Hello0.class JVM Hello0 java > java Hello0.class Hello World! javac Java JVM java JVM : Java > javac 2> Q Foo.java Java : Q B

参考 - メインスレッドは JVM によって自動的に起動されるため 起動するコードを書く必要 はありません 今まで例題 演習で作成してきたプログラムは全てメインメソッドにて 動作している シングルスレッドです マルチスレッドマルチスレッドとは名前のとおり複数のスレッドと言う意味です マルチスレッドは

< F2D A838B838D96402E6A7464>


ガイダンス

ガイダンス

Java 2 p.2 2 Java Hello0.class JVM Hello0 java > java Hello0.class Hello World! javac Java JVM java JVM : Java > javac 2> Q Foo.java Java : Q 2.

I HTML HashMap (i) (ii) :.java import java.net.*; import java.io.*; import java.util.hashmap; public class SimpleStopWatch { public static voi

Microsoft Word 年度情報コミュニケーション実験II(Ver0.9)c.docx

Microsoft PowerPoint - 第1回.pptx

< F2D A839382CC906A2E6A7464>

Java言語 第1回

Microsoft PowerPoint - prog12.ppt

Prog2_11th

r14.dvi

I. (i) Java? (A). 2Apples (B). Vitamin-C (C). Peach21 (D). Pine_Apple (ii) Java? (A). Java (B). Java (C). Java (D). JavaScript Java JavaScript Java (i

Prog1_12th

2 p.2 2 Java Hello0.class JVM Hello0 java > java Hello0.class Hello World! javac Java JVM java JVM : Java > javac 2> Q Foo.java Java : Q B

I. java.awt.rectangle java.lang.math random Java TM API java.awt Rectangle Rectangle (x,y)... public int x Rectangle X public int y Rectangle Y public

:30 12:00 I. I VII II. III. IV. ( a d) V. VI : this==null, T == N A ActionListener A addactionlistener C class D actionperformed

ToDo: 今回のタイトル

GEC-Java

Microsoft Word - Java3.DOC

2 p.2 2 Java Hello0.class JVM Hello0 java > java Hello0.class Hello World! javac Java JVM java JVM : Java > javac 2> Q Foo.java Java : Q B

tn_soturon_sjis.dvi

II Java :30 12:00 I. I IV II. III. IV. ( a d) V. : this==null, T == N A ActionListener C class D actionperformed G getsource I implements K

2 p.2 2 Java > javac Hello0.java Hello0.class JVM Hello0 java > java Hello0.class Hello World! javac Java JVM java JVM : Java > javac 2> Q Foo.j

Transcription:

Java 独習第 3 版 13.12 スレッドの使用 13.13 ダブルバッファリング 2006 年 7 月 12 日 ( 水 ) 南慶典

表示の更新もそういた作業のひとつに当たる 13.12 スレッドの使用アニメーション アニメーションやシミュレーションなどは画面の更新が一定のタイミングで行われていく この連続した画面の更新をスレッドを利用して行う しかし paint() メソッドを直接呼び出して表示を更新することはできない その理由は 多くの重要な作業のスケジュールは JVM によって制御されているから ガーベジコレクション 不要になったオブジェクトのメモリリソースを自動的に回収 I/O( 入出力の略 ) スレッド管理 など

ウィンドウを更新するには 1.repaint() メソッドを呼び出しウィンドウの更新を要求する 2.JVM でウィンドウを更新する適切なタイミングが判断され update() メソッドが呼び出される 3.update() メソッドの既定の実装では アプレットウィンドウを背景色 ( デフォルトでは白色 ) で塗りつぶしてから paint() メソッドを呼び出す また Applet クラスを拡張しなければならないのでスレッドを作成するには Runnable を実装する

例スレッドの使用 import java.applet.*; import java.awt.*; /* <applet code="counter" width=250 height=100> </applet> */ public class Counter extends Applet implements Runnable{ int counter; Thread t; public void init(){ // カウンタを初期化する counter = 0; public void run() { try{ while(true){ // 再描画を要求する repaint(); // 次のカウンタを表示する前に休止する Thread.sleep(1000); // カウンタを1つ進める ++counter; catch(exception e){ // スレッドを開始する t = new Thread(this); t.start();

public void paint(graphics g){ // フォントを設定する g.setfont(new Font("Serif", Font.BOLD, 36)); // フォントメトリックスを取得する FontMetrics fm = g.getfontmetrics(); // カウンタを表示する String str = "" + counter; Dimension d = getsize(); int x = d.width / 2 - fm.stringwidth(str) / 2; g.drawstring(str, x, d.height / 2); update() メソッドはオーバーライドしていない アプレットウインドウが背景色で塗りつぶされた後で paint() メソッドが呼び出される このアプレットでは 1 秒間隔で数字が表示されていく

例 update() をオーバーライド 0.2 秒間隔でアプレットウィンドウ上に無作為に点を表示するプログラム update() メソッドをオーバーライドして 前に表示した点を消去しないようにしている import java.applet.*; import java.awt.*; /* <applet code="dots" width=250 height=100> </applet> */ public class Dots extends Applet implements Runnable{ Thread t; public void init(){ // スレッドを開始する t = new Thread(this); t.start(); public void run(){ try{ while(true){ // 再描画を要求する repaint(); / 次の点を表示する前に休止する Thread.sleep(200); catch(exception e){ public void update(graphics g){ paint(g);

public void paint(graphics g){ // ウィンドウ内の無作為な場所を選択する Dimension d = getsize(); int x = (int)(math.random() * d.width); int y = (int)(math.random() * d.height); // そこに点を描画する g.fillrect(x, y, 2, 2); update() メソッドをオーバーライド paint() メソッドを呼び出す前に アプレットウィンドウを背景色で塗りつぶさないようにしている このアプレットでは 点が無作為な場所に表示され 増えていく

13.13 ダブルバッファリング ちらつきを防ぐ update() メソッドによる ちらつき ウィンドウ全体を背景色で塗りつぶして消去し その後 paint() メソッドを呼び出してアプレットの出力を表示する 見苦しい ちらつき の原因となってしまう ダブルバッファリングアプレットウィンドウのちらつきを防ぐ手法 1.update() メソッドをオーバーライドし ウィンドウ全面を消去しないようにする このメソッドではただ paint() メソッドを呼び出すようにする 2. また paint() メソッド内では 全ての描画操作をバッファ ( オフスクリーン ) に対して行う そして最後にバッファをウィンドウにコピーする

バックグラウンドバッファの作成 バックグラウンドのバッファ ( オフスクリーン ) を作成するには Component クラスの createimage() メソッドを使う Image createimage(int width, int height) width と height は オフスクリーンとなるバッファのサイズを指定する 例ではアプレットウィンドウと同じサイズのバッファを作成している この作成したバッファ ( オフスクリーン ) に対して描画を行っていく その描画を行う際に グラフィックコンテキストを用意する必要がある

グラフィックコンテキストの取得 グラフィックコンテキスト 描画環境のようなもの ( 色だとかフォントだとか ) バッファのための描画環境を用意する必要がある このバッファのグラフィックコンテキストは Image の getgraphics() メソッドを使って取得する abstract Graphics getgraphics() このグラフィックコンテキストを使って描画操作を実行し バッファをウィンドウにコピーする 次の場面だけが映されていくのでちらつきを解消できる!! コピーするには Graphics クラスの drawimage() メソッドを使う

ダブルバッファリングしない例 import java.applet.*; import java.awt.*; /* <applet code="nodoublebuffer" width=300 height=100> </applet> */ public class NoDoubleBuffer extends Applet implements Runnable{ int x = 0; Thread t; public void init(){ public void run(){ try{ while(true){ // 再描画を要求する repaint(); // ウインドウを更新する前に休止する Thread.sleep(100); catch(exception e){ // スレッドを開始する t = new Thread(this); t.start();

public void paint(graphics g){ // 塗りつぶした円を描画する Dimension d = getsize(); g.filloval(x, d.height / 4, 50, 50); // x 座標を増やす x += 5; if(x + 50 > d.width) x = 0;

ダブルバッファリングする例 import java.applet.*; import java.awt.*; /* <applet code="doublebuffer" width=300 height=100> </applet> */ public class DoubleBuffer extends Applet implements Runnable{ int x = 0; Thread t; Image buffer; Graphics bufferg; public void init(){ // スレッドを開始する t = new Thread(this); t.start(); // バッファを作成する Dimension d = getsize(); buffer = createimage(d.width, d.height); public void run(){ try{ while(true){ // 再描画を要求する repaint(); // ウィンドウを更新する前に休止する Thread.sleep(100); catch(exception e){ public void update(graphics g){ paint(g);

public void paint(graphics g){ // バッファのグラフィックコンテキストを取得する if(bufferg == null) bufferg = buffer.getgraphics(); // バッファを描画する Dimension d = getsize(); bufferg.setcolor(color.white); bufferg.fillrect(0, 0, d.width, d.height); bufferg.setcolor(color.black); bufferg.filloval(x, d.height / 4, 50, 50); // ウィンドウを更新する g.drawimage(buffer, 0, 0, this); // x 座標を増やす x += 5; if(x + 50 > d.width) x = 0; init() メソッドでアプレットと同じサイズのバッファ ( オフスクリーン ) を作成 paint() が最初に呼び出された時に グラフィック画面が作成される ( バッファに対して描画が行われている ) repaint() メソッドでウィンドウを更新 ( バッファの画を貼り付けていく )

練習問題 問題 1 デジタル時計をアプレットで作成しなさい 時計は何時何分何秒まで表示させること 問題 2 虹色カラーバーを作成し 左から右に動いていくアプレットを作成しなさい その際ダブルバッファリングしていないものと ダブルバッファリングしたものと 2 つ作成しなさい 虹色カラーバーは P396~P397 の例題を参照すること