アプレットⅤ

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

< F2D82518CC282CC D2E6A7464>

< F2D F B834E2E6A7464>

Microsoft PowerPoint - OOP.pptx

< F2D B838A835882CC8CF68EAE2E6A7464>

< F2D82B682E182F182AF82F12E6A7464>

< F2D834F838C A815B A CC>

< F2D825282CC947B909482CC A815B83682E6A>

< F2D89BA8EE882C E6A7464>

< F2D92DE82E8914B82CC977088D32E6A7464>

< F2D82518E9F8AD CC834F CC8CFC82AB82C68D4C>


< F2D8EA CE909482CC92EA82852E6A7464>

< F2D BCA82CC978E89BA82CC8EC08CB12E6A7464>

Microsoft PowerPoint prog1_doc2x.pptx

< F2D82518E9F8AD CC95BD8D7388DA93AE2E6A7464>

< F2D A839382CC906A2E6A7464>

Microsoft PowerPoint prog1_doc2.pptx

< F2D B825082CC96E291E82E6A7464>

< F2D E E6A7464>

GUIプログラムⅣ

< F2D A838B838D96402E6A7464>

アプレットの作成

Microsoft PowerPoint 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 +=

Java言語 第1回

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

Thread

untitled

r3.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

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

ガイダンス

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

ガイダンス

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

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

GUIプログラムⅤ

Microsoft PowerPoint ppt

2

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

グラフィックス

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

Java言語 第1回

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

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

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

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

Chapter 20. [ ] ; [ ] = new [ ] ; Color colors [ ] = new Color[ 20 ]; // 20 Button operations [ ] = new Button[ 10 ]; // 10 colors[ 3 ] = new Color( 1

アプレットⅠ

Microsoft PowerPoint ppt

例外(exception)とは何か

: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

r2.dvi

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

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

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

I. (i) Java? (A). Foo_Bar (B). G day (C). 999 (D). Golgo13 (ii)? (A). Java public (B). Java (C). Java JavaScript (D). Java C Java C (iii)? (A). Java (

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

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

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

r4.dvi

アプレットⅣ

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

vol.30.}...`.X...b.h

IT プロジェクト

KeyListener init addkeylistener addactionlistener addkeylistener addkeylistener( this ); this.addkeylistener( this ); KeyListener public void keytyped

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

text_13.dvi

Microsoft PowerPoint - prog10.ppt

Microsoft PowerPoint - prog10.ppt

ガイダンス

Microsoft PowerPoint - prog11.ppt

: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

ガイダンス

I. (i) Foo public (A). javac Foo.java java Foo.class (C). javac Foo java Foo (ii)? (B). javac Foo.java java Foo (D). javac Foo java Foo.class (A). Jav

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

GUIプログラムⅡ

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

Microsoft PowerPoint - prog11.ppt

PowerPoint Presentation

Programming-C-9.key

JAVA入門

Java言語 第1回

ICONファイルフォーマット

<4D F736F F F696E74202D AC C8899E D834F E >

226

:30 12:00 I. I V II. III. IV. ( a d) V. VI : A ActionListener aa addactionlistener AE ActionEvent K KeyListener ak addkeyliste

新・明解Java入門

2

VB.NET解説


Java知識テスト問題

ルーレットプログラム

r2.dvi

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

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 B

Javaセキュアコーディングセミナー2013東京第1回 演習の解説

Transcription:

アプレット Ⅴ JV5 今回の課題項目 アプレット ( シングルスレッド ) アプレット ( マルチスレッド ) アプレット ( スレッド処理 生成 起動 実行 停止 ) アプレット ( ダブルバッファリング ) ウィンドウ ( ウェイト ) 今回の重点項目 アプレット ( マルチスレッド ) アプレット ( ダブルバッファリング ) ウィンドウ ( ウェイト ) -1-

アプレット マルチスレッド スレッドとは スレッドとは プログラムの最小実行単位で有る アニメーションの様にグラフィックスを動かす場合や ネットワーク通信時に待つ場合等に使用される スレッドは java.lang に含まれて居て 使用する場合には Thread クラスを extends( 継承 ) するか Runnable インターフェイスを implements( 実装 ) する必要が有る メソッドとしては run メソッドの実装が必要で有る スレッドの処理 スレッドは Thread オブジェクトを生成し start メソッドを呼ぶ事で起動される 生成した Thread インスタンスは th 等の変数に格納する 変数を使わない場合 Thread.currentThread(); で 自分のスレッドを取得する事も出来る 実際の処理は run メソッドで実行するので 必要な処理を実装する必要が有る run メソッドは スレッドが終了する迄 動作し続ける タイマ割り込みを使用して 一定時間毎の処理を組み込みたい場合は sleep メソッドにミリ秒単位の割り込み間隔を指定する アプレットでアニメーション表示する場合には repaint メソッドで画面を再表示する 他のスレッド等と同期を取る場合は wait メソッドを使用する スレッドの停止は stop メソッドは使わずに インスタンス変数を null にする事で 終了する Runnable インターフェイスを implements class クラス名 implements Runnable Thread th;... スレッドの生成と起動 th = new Thread( this ); th.start( ); スレッドの実行 ( タイマ割り込みの場合 ) public void run( ) while( th!= null ) // 表示等の処理 try Thread.sleep( 割り込み間隔 ); catch( InterruptedException e ) スレッドの停止 th = null; -2-

ダブルバッファリング JAVA でアニメーションやゲームを作成した時 画面がちらつく事が有る 此れは 背景を塗り潰してからキャラを描画する迄の間に 何も無い画面が見えて仕舞う事で起こる 其処で 此の背景を塗り潰す作業も含めて一度に一枚の画像と仕て描いて仕舞えばちらつきは無く成る 此の方法を ダブルバッファリング と謂い 貯めて置く画像をオフスクリーンバッファと謂う 先ず 描画画面一杯の大きさの画像を用意する Compornent クラスの createimage メソッドを利用すれば良い 此の画像がオフスクリーンバッファと成る 亦 バッファに描画する為の Graphics オブジェクト ( 以降 グラフィックコンテキスト ) も取得する 此れは バッファの getgraphics メソッドを利用する 然して update メソッドをオーバーライドし 其の儘 paint メソッドに繋ぐ 実は此の update メソッドでは画面を背景色で塗り潰すと謂う作業が行われて居り 其れをオーバーライドする事でちらつきを無くす 次に paint メソッドをオーバーライド仕て バッファを画面に描画する 此の時も無駄な処理をせずに drawimage メソッドを使って座標 ( 0, 0 ) の処にバッファを描く丈で有る 後は run メソッド等でスレッドループ中にバッファに描画し repaint メソッドを呼ぶ wait に依るウェイト Thread クラスの静的メソッドで有る sleep を使用すれば一定時間止める事が出来るが Object クラスの中にも wait と謂うメソッドが有る 此れを使用して一定時間プログラムの実行を止める方法は 下記の通りで有る 1 秒間止め様と単に wait(1000) と記述すると実行時に エラーが発生する 併し 此のメソッドを synchronized 修飾子の中に入れて遣り 下記の様なメソッドを作成すると旨く行く // 指定ミリ秒実行を止めるメソッド public synchronized void sleep ( long msec ) try wait ( msec ); catch ( InterruptedException e ) 此のメソッドを自作のクラスに追加すれば sleep(1000) とする丈で 1 秒間実行を止める事が出来る 而も 単一スレッドなので動作は安定して居り 動作も軽い 併し アプレットでは start メソッドが終了して初めてアプレットが開始される為 start メソッド内では使う事が出来ず 更に 新たにメソッドを呼び出して其処で使用しても start メソッドは終了し無い為 アプレットでは使用する事は出来ない -3-

演習 マルチスレッド処理 (1) 下記のコードを テキストエディタで入力し MultiThread.java と謂うファイル名で保存した後 コンパイルして HTML ファイルから呼び出し ブラウザで表示する import java.applet.*; import java.awt.*; public class MultiThread extends Applet implements Runnable Thread th = null; int x = 0; // 表示処理 public void paint( Graphics g ) g.setfont( new Font( "MS 明朝 ", Font.PLAIN, 18 ) ); g.drawstring( " 烏賊の王様 ", x, 50 ); x = x + 5; if ( x > 300 ) x = -100; public void start( ) // スレッド開始 th = new Thread( this ); th.start( ); public void run( ) // スレッド実行処理 while( th!= null ) repaint( ); try Thread.sleep( 100 ); catch( InterruptedException e ) public void stop( ) // スレッド終了 th = null; -4-

マルチスレッド処理 (2) 下記のコードを テキストエディタで入力し MoveCircle.java と謂うファイル名で保存した後 コンパイルして HTML ファイルから呼び出し ブラウザで表示する import java.applet.*; import java.awt.*; public class MoveCircle extends Applet implements Runnable public Thread th = null; int x, y; int dx, dy; public void init( ) x = 0; y = 80; dx = 10; dy = 5; public void paint( Graphics g ) g.setcolor( new Color( 255, 0, 0 ) ); g.fillarc( x, y, 30, 30, 0, 360 ); // 此の関数は applet が画面に現れる時に自動で呼ばれるので 此処で アニメーションを開始させる public void start( ) if ( th == null ) th = new Thread( this ); th.start(); // 此れで 自動で関数 run が呼び出される // 此の関数は applet が画面から消える時に自動で呼ばれるので 此処で アニメーションを中断させる public void stop( ) if ( th!= null ) th.stop( ); // アニメーションを止める th = null; -5-

// スレッド名 start を実行すると自動で呼び出される ( 此処は 他の処理とは別にマルチタスクで実行される ) public void run( ) while( th.isalive( ) ) x += dx; y += dy; if ( x > size( ).width - 30 x < 0 ) x -= dx; dx *= -1; if ( y > size( ).height - 30 y < 0 ) y -= dy; dy *= -1; repaint( ); // 以下の記述が無いとブラウザが固まる ( 待ち時間は任意 ) try Thread.sleep( 100 ); // 100 ミリ秒待つ catch ( InterruptedException e ) -6-

ダブルバッファリング処理 (1) 下記のコードを テキストエディタで入力し DoubleBuffer.java と謂うファイル名で保存した後 コンパイルして HTML ファイルから呼び出し ブラウザで表示する import java.applet.*; import java.awt.*; public class DoubleBuffer extends Applet implements Runnable final static int MAX = 10, SZ = 20; // ボールの最大表示数 ボールのサイズ ( 定数 ) Graphics bg; // バッファのグラフィックコンテキスト Image bf, bk; // バッファ 背景のイメージ Thread th = null; int wm, wt, w, h; int[ ] x, y, m; // ボールの X 座標 Y 座標 移動量 public void init( ) // アプレットの初期化時呼び出される Dimension d = getsize( ); // アプレットサイズ取得 bf = createimage ( w = d.width, h = d.height ); // バッファの作成 bg = bf.getgraphics( ); // バッファ描画用グラフィックコンテキストの取得 makebackimage( ); private void makebackimage( ) // 背景イメージ作成用メソッド Graphics g; bk = createimage ( w, h ); // 背景の作成 g = bk.getgraphics( ); for ( int i = 0; i < h; i++ ) g.setcolor ( new Color ( 0, 0, ( int )( Math.random( ) * 255 ))); g.drawline ( 0, i, w, i ); public void start( ) if ( th == null ) th = new Thread ( this ); th.start( ); public void run( ) x = new int [ MAX ]; y = new int [ MAX ]; // アプレットが表示されると呼び出される // スレッドの生成 // スレッドを開始させ run メソッドを呼び出す // メインルーチン -7-

m = new int [ MAX ]; wm = wt = 0; for ( int i = 0; i < MAX; i++ ) x [ i ] = -99; bg.setcolor ( Color.yellow ); // ボールの色設定 try while ( th!= null ) wt++; bg.drawimage ( bk, 0, 0, this ); // 背景イメージでバッファをクリア for ( int i = 0; i < MAX; i++ ) if ( x [ i ] == -99 && wt > wm ) x [ i ] = -SZ; y [ i ] = ( int )( Math.random( ) * ( h - SZ )); m [ i ] = ( int )( Math.random( ) * 7 ) + 2; wt = 0; wm = ( int )( Math.random( ) * 20 ) + 4; else x [ i ] += m [ i ]; if ( x [ i ] > w ) x [ i ] = -99; bg.filloval ( x [ i ], y [ i ], SZ, SZ); // ボールをバッファに描画 repaint( ); // update メソッドを呼び出す th.sleep ( 100 ); // 0.1 秒間スリープ ( ハングアップ防止 ) catch(interruptedexception e) public void update( Graphics g ) paint ( g ); public void paint( Graphics g ) g.drawimage ( bf, 0, 0, this ); public void stop( ) if ( th!= null ) th.stop( ); th = null; // オーバーライド仕て最低限の事丈をする // バッファを画面に描画 // アプレットが画面から消えると呼び出される // スレッドの停止 -8-

ダブルバッファリング処理 (2) 下記のコードを テキストエディタで入力し Clock.java と謂うファイル名で保存した後 コンパイルして HTML ファイルから呼び出し ブラウザで表示する import java.applet.*; import java.awt.*; import java.awt.event.*; import java.util.date; public class Clock extends Applet implements Runnable, ActionListener Thread th = null; boolean ts; // サスペンド状態 Button btnsuspend,btnresume; // 停止 再開ボタン Graphics bg; // バッファ描画用グラフィックコンテキスト Image bf; // バッファ用 Dimension d; // アプレットサイズ用 public void init( ) d = getsize( ); // アプレットサイズ取得 bf = createimage( d.width, d.height ); // バッファの作成 bg = bf.getgraphics( ); // バッファ描画用グラフィックコンテキストの取得 bg.setcolor( Color.blue ); bg.setfont( new Font( "TimesRoman", Font.BOLD, 18 ) ); add( btnsuspend = new Button( " 停止 " ) ); add( btnresume = new Button( " 再開 " ) ); btnsuspend.addactionlistener( this ); btnresume.addactionlistener( this ); public void start( ) if( th == null ) th = new Thread( this ); ts = false; th.start( ); repaint( ); public void update( Graphics g ) paint( g ); -9-

public void paint( Graphics g ) if ( ts == false ) Date date = new Date( ); bg.clearrect( 0, 0, d.width, d.height ); bg.drawstring( date.tostring( ), 0, 60 ); g.drawimage( bf, 0, 0, this ); public void run( ) Thread thisthread = Thread.currentThread( ); while( thisthread == th ) try th.sleep( 1000 ); if ( ts ) synchronized( this ) while ( ts && thisthread == th ) wait( ); catch( InterruptedException e ) repaint( ); public synchronized void stop( ) th = null; notify( ); public synchronized void actionperformed( ActionEvent e ) if( e.getsource( ) == btnsuspend ) ts = true; else if( e.getsource() == btnresume && ts == true ) ts = false; notify( ); -10-

参考 アナログ時計 下記のコードを テキストエディタで入力し AnalogClock.java と謂うファイル名で保存した後 コンパイルして HTML ファイルから呼び出し ブラウザで表示する import java.applet.*; import java.awt.*; import java.util.*; public class AnalogClock extends Applet implements Runnable private Thread th = null; private int cx; private int cy; private static final int HOUR_LENGTH = 50; // 時針の長さ private static final int MINUTE_LENGTH = 70; // 分針の長さ private static final int SECOND_LENGTH = 80; // 秒針の長さ public void init( ) setbackground( new Color( 255, 255, 128) ); Dimension d = getsize( ); cx = (int) d.width / 2; cy = (int) d.height / 2; public void start( ) if ( th == null ) th = new Thread( this ); th.start( ); public void stop( ) th = null; public void run( ) -11-

while ( Thread.currentThread( ) == th ) repaint( ); try th.sleep(1000); catch ( InterruptedException e ) public void paint( Graphics g ) // グレゴリウス暦で現在の日時を取得 Calendar cl = new GregorianCalendar( ); cl.settime(new Date( ) ); // 現在の時刻を表示 g.drawstring( cl.get( Calendar.HOUR_OF_DAY ) + ":" + cl.get( Calendar.MINUTE ) + ":" + cl.get( Calendar.SECOND ), 5, 30); // 座標を計算 double sr = Math.PI / 180 * ( cl.get( cl.second ) * 6.0 + 270.0 ); int sx = (int) ( SECOND_LENGTH * Math.cos( sr ) ); int sy = (int) ( SECOND_LENGTH * Math.sin( sr ) ); double mr = Math.PI / 180 * ( cl.get( cl.minute ) * 6.0 + 270.0 ); int mx = (int) ( MINUTE_LENGTH * Math.cos( mr ) ); int my = (int) ( MINUTE_LENGTH * Math.sin( mr ) ); double hr = Math.PI / 180 * ( cl.get( cl.hour ) * 30.0 + 270.0 ); int hx = (int) ( HOUR_LENGTH * Math.cos( hr ) ); int hy = (int) ( HOUR_LENGTH * Math.sin( hr ) ); // 文字盤を表示 g.drawstring( "12", cx-5, cy - SECOND_LENGTH - 5 ); g.drawstring( "3", cx-5 + SECOND_LENGTH + 15, cy + 5 ); g.drawstring( "9", cx-5 - SECOND_LENGTH - 15, cy + 5 ); g.drawstring( "6", cx-5, cy + SECOND_LENGTH + 15 ); // 描画 g.drawline( cx, cy, cx + sx, cy + sy ); g.setcolor( Color.blue ); g.drawline( cx, cy, cx + mx, cy + my ); g.drawline( cx, cy, cx + hx, cy + hy ); -12-

3D 立方体の回転 下記のコードを テキストエディタで入力し Cube3D.java と謂うファイル名で保存した後 コンパイルして HTML ファイルから呼び出し ブラウザで表示する 此のアプレットでは マウスでドラッグした方向に 立方体が 回転する 即ち アプレット上で マウスをクリックし 上方にドラッグすると 立方体は 上方に回転する 亦 ドラッグ距離が 大きい程 回転速度も大きく成る import java.applet.applet; import java.awt.graphics; import java.awt.event; public class Cube3D extends Applet implements Runnable public Thread th = null; // 物体の定義 ( 表示する線を3 次元座標で指定 ) double[ ][ ] line3d = -50.0, -50.0, -50.0, 50.0, -50.0, -50.0, -50.0, -50.0, -50.0, -50.0, 50.0, -50.0, -50.0, -50.0, -50.0, -50.0, -50.0, 50.0, 50.0, -50.0, -50.0, 50.0, 50.0, -50.0, 50.0, -50.0, -50.0, 50.0, -50.0, 50.0, -50.0, 50.0, -50.0, 50.0, 50.0, -50.0, -50.0, 50.0, -50.0, -50.0, 50.0, 50.0, -50.0, -50.0, 50.0, 50.0, -50.0, 50.0, -50.0, -50.0, 50.0, -50.0, 50.0, 50.0, 50.0, 50.0, 50.0, -50.0, 50.0, 50.0, 50.0, 50.0, 50.0, 50.0, -50.0, 50.0, 50.0, 50.0, 50.0, 50.0, 50.0, -50.0 ; double alpha, beta; double d_alpha, d_beta; int mouse_x, mouse_y; public void init( ) alpha = 1.0; beta = 1.0; d_alpha = d_beta = 0.0; public void start( ) if ( th == null ) -13-

th = new Thread( this ); th.start( ); public void stop( ) if ( th!= null ) th.stop( ); th = null; public void paint( Graphics g ) int i; int x1, x2, y1, y2; for ( i = 0; i < 12; i++ ) x1 = (int) ( line3d[ i ][ 0 ] * Math.cos( beta ) + line3d[ i ][ 2 ] * Math.sin( beta ) + 0.5 ); y1 = (int) ( line3d[ i ][ 1 ] * Math.cos( alpha ) - ( line3d[ i ][ 2 ] * Math.cos( beta ) - line3d[ i ][ 0 ] * Math.sin( beta ) ) * Math.sin( alpha ) + 0.5 ); x2 = (int) ( line3d[ i ][ 3 ] * Math.cos( beta ) + line3d[ i ][ 5 ] * Math.sin( beta ) + 0.5 ); y2 = (int) ( line3d[ i ][ 4 ] * Math.cos( alpha ) - ( line3d[ i ][ 5 ] * Math.cos( beta ) - line3d[ i ][ 3 ] * Math.sin( beta ) ) * Math.sin( alpha ) + 0.5 ); g.drawline( x1 + 200, y1 + 150, x2 + 200, y2 + 150 ); public void update( Graphics g ) if ( d_alpha!= 0.0 d_beta!= 0.0 ) super.update( g ); -14-

public boolean mousedown( Event ev, int x, int y ) d_alpha = d_beta = 0.0; mouse_x = x; mouse_y = y; return true; public boolean mousedrag( Event ev, int x, int y ) d_beta += ( x - mouse_x ) * 0.001; // マウスをドラッグすれば d_alpha += ( y - mouse_y ) * 0.001; // 回転速度を変更 mouse_x = x; mouse_y = y; return true; public void run( ) while( th.isalive( ) ) alpha += d_alpha; beta += d_beta; repaint( ); // 回転速度の分丈 物体を回転させる try Thread.sleep( 50 ); catch ( InterruptedException e ) -15-

ウェイト処理 下記のコードを テキストエディタで入力し WaitTimer.java と謂うファイル名で保存した後 コンパイルして 実行する ( 此のプログラムは アプレットでは無い ) import java.awt.*; public class WaitTimer extends Frame long count = 0; public static void main ( String args[ ] ) new WaitTimer( ); public WaitTimer( ) resize ( 140, 50 ); settitle ( "WaitTimer" ); show( ); start( ); private void start( ) while ( true ) count++; repaint( ); sleep ( 1000 ); public synchronized void sleep ( long msec ) try wait ( msec ); catch ( InterruptedException e ) public void paint ( Graphics g ) g.setcolor ( Color.blue ); g.drawstring ( "Count : " + count, 30, 40 ); public boolean handleevent ( Event ev ) if ( ev.id == Event.WINDOW_DESTROY ) dispose( ); System.exit ( 0 ); return super.handleevent ( ev ); // ウインドウサイズを 140x50 に設定 // paint メソッドを呼び出す // 1 秒間止める // 指定ミリ秒実行を止めるメソッド // count の値を表示する // 閉じるボタンがクリックされた -16-