Java プログラミング -入門編-

情報処理学会九州支部講習会 「インターネット最前線」
Java プログラミング-入門編九州工業大学情報科学センター 山之上 卓
1999 年 2 月 9 日
1.Java 概要
2.簡単なアプレット
3.動画を表示するアプレット
4.アプレットの改良
5.開発環境の利用(データベース)
1.Java 概要
1-1 特徴
1-2 Java 開発キット JDK
1-3 アプレットとアプリケーション
1-4 オブジェクト指向とイベント駆動
1-1 特徴
 ネットワーク
 オブジェクト指向
 どこでも動く(?),
Java VM(仮想マシン)
 シンプル(>C++), 現実的(>SmallTalk)
 Thread … concurrent programming可
 GC
 セキュリティー
1-2 Java 開発キット JDK
(Java の開発元) が無料で提供, Web
や雑誌などで手に入る.
 javac … Java コンパイラ
 java … アプリケーション実行
 appletviewer … アップレット実行
 jar … Java アーカイブ(jar)操作
 その他
 SUN
1-3 アプレットとアプリケーション
 アプレットは
WWW ブラウザの上で動くプ
ログラム.
– セキュリティのため、様々な制限あり
 アプリケーションは通常のプログラム.
– アプリケーションでネットワークプログラミング
も可能 ex. HotJava.
 アプリケーションのコンパイルと実行
 アプレットのコンパイルと実行
アプリケーションのコンパイルと
実行
 プログラム例,
コンパイル, 実行
% cat Hello.java
public class Hello {
static public void main(String argv[]){
System.out.println("hello world.");
}
}
% javac Hello.java Hello.class ができる.
% java Hello
hello world.
%
アプレットのコンパイルと実行
 プログラム例
Hello1.java:
import java.awt.*;
import java.applet.*;
public class Hello1 extends java.applet.Applet{
public void paint(Graphics g){
g.drawString("HelloWorld",10,20);
}
}
 html
例
applet.html:
<applet code="Hello1.class" width=100 height=50>
</applet>
アプレット描画画面の幅
アプレット描画画面の高さ
 コンパイル
% javac Hello1.java
Hello1.class ができる.
Hello1.class と applet.html を同じディレクトリに
置く
 ローカルマシンでの実行
% appletviewer applet.html
または普通の html ファイルとして閲覧する
ことによって実行.
Windows などでは、applet.html のアイコンを開く
(ダブルクリックなど)

WWW サーバに載せる場合
- ftp 等で *.class と *.html をサーバに転送
- この html をブラウザで見れば実行開始
- *.class をブラウザが受信して、ローカル(クライ
アント)マシンで実行される
http server
applet.html
Hello1.java
1-4 オブジェクト指向とイベント駆動
 「オブジェクト」と「メッセージパッシング」
 マルチプロセスOSと類似
プログラムは「クラス」の定義の列
 1つのクラスの中身は、1つの C プログラ
ムに類似 … 「メソッド」~関数
 クラスはオブジェクトの鋳型 … new で生成
 「イベント」駆動
 Java
– OS がプログラムを呼び出す
2.簡単なアプレット
2-1 ボールを表示
2-2 マウスをクリックした場所にボールを移動
2-3 ボール処理部分を分離
2-1ボールを表示
プログラム 1.
import java.awt.*;
import java.applet.*;
public class BallApplet1 extends java.applet.Applet {
public void paint(Graphics g) // ブラウザの表示が更新されるとき、
// ブラウザ側から呼び出される.
{
g.setColor(Color.red);
g.fillOval(100,100, // 楕円が入る左上の座標(x,y)
30,30); // 楕円の幅と高さ
}
}
ボールを表示するプログラム
import … 利用する既存のクラスを指定.
java.awt.* … awt は Abstract Window ToolKit(ポー
タブル GUIライブラリ)である. java.awt は awt「パッ
ケージ(クラスやパッケージの集合)」を表す.
Graphics クラスを使うために必要.
public … 外部からアクセス可 <-> private
class クラス名 … このクラスの名前
extends … クラスの「拡張(継承)」, 上位クラスの定
義がまるごと使える
Applet クラス… applet の道具立て. 様々なデ
フォルト(メソッド etc.)が準備されている.
ボールを表示するプログラム
void… C の場合と同じ. 値を返さない。
paint… 描画を行う「メソッド」. 表示が更新された
ときなど、ブラウザ側から、何度も呼び出される
Graphics g… オブジェクト g が描画画面
g.setColor …
色の設定, オブジェクト g の setColor メソッドを呼
び出す(メッセージパッシング)
Color.red … Color クラスの赤 (定数)
g.fillOval … 塗りつぶし楕円を描く,
2-2.マウスをクリックした場所にボール
を移動
プログラム2.
import java.awt.*;
import java.applet.*;
public class BallApplet2 extends java.applet.Applet {
int px,py;
public void init() // 初期化のとき呼ばれる.
{ px=100; py=100; }
public boolean mouseDown(Event e,int x, int y)
// マウスがクリックされたとき呼ばれる
{ px=x; py=y; repaint(); return true;}
public void paint(Graphics g)
{ g.setColor(Color.red); g.fillOval( px,py, 30,30);
}
}
マウスをクリックした場所にボールを移動
int px,py; … ボールの位置
init … 初期化のとき(最初の1回)ブラウザ側から呼
ばれる. この他 start, stop 等も使える.
boolean … ブール型, true, false
mouseDown … マウスがクリックされたとき、ブラウ
ザ側から呼ばれる. true を返すと、この後,なにもし
ない.
repaint … 画面を clear した後, paint を呼び出す.
2-3.ボール処理部分を分離
プログラム 3. (1/2)
import java.awt.*;
import java.applet.*;
public class BallApplet3 extends java.applet.Applet {
ABall ball;
public void init() // 初期化のとき呼ばれる
{ ball=new ABall(100,100,Color.red); }
public boolean mouseDown(Event e,int x, int y)
// マウスがクリックされたとき呼ばれる
{ ball.mouseDown(x,y); this.repaint(); return true; }
public void paint(Graphics g)
{ ball.paint(g); }
}
プログラム3(2/2)
class ABall{
int px,py;
Color color;
public ABall(int x, int y, Color c) // “constructor”
{ px=x; py=y; color=c;}
//
public void mouseDown(int x, int y)
{ px=x; py=y; } // マウスがクリックされたとき、場所を変える
public void paint(Graphics g) {
g.setColor(color);
g.fillOval( px,py, 30,30); // 塗りつぶした楕円を描く
}
}
ボール処理部分を分離
Ball ball … Ball型(クラス)の オブジェクトを格納する変
数 ball を宣言. 別のクラスを利用-「コンポジション」
ball=new Ball(…) … 「コンストラクタ」 Ball(…)によって
新たにオブジェクトを作り ball に代入.
ball.○○ … ball オブジェクトの○○メソッドまたは変数
this.repaint() … this はこの(アプレット)オブジェクトを示
す.
int は new していないことに注意
public Ball(…) … コンストラクタ. オブジェクトを生成す
るときに使用, void 等の型がないことに注意.
3.動画の表示 - ボールを動かす
3-1 設計方針
3-2 ABall クラス
3-3 動かないアプレット
3-4 動くアプレット … Thread の利用
3-1. 設計方針
ABall クラス (1/2)
class ABall{
double px,py;
//ボールの場所
double dx,dy;
//一定時間後の移動. 進行方向
double velocity;
//速度(の係数)
double xmin,xmax; // x 方向の移動範囲
double ymin,ymax; // y 方向の移動範囲
Random rm;
// rm は乱数発生装置
Color color;
public ABall(int x, int y, Color c) {init(x,y,c);}
public void init(int x, int y, Color c) {
px=x; py=y; color=c;
xmin=10.0; xmax=300.0; ymin=10.0; ymax=300.0;
velocity=10.0;rm = new Random();
dx=rm.nextDouble()*2-1.0; dy=rm.nextDouble()*2-1.0;
}
ABall クラス (2/2)
public void advance(){
px+=(dx*velocity); py+=(dy*velocity);
if(px < xmin){dx=rm.nextDouble(); dy=rm.nextDouble()*2-1.0;}
if(xmax < px){dx=-rm.nextDouble(); dy=rm.nextDouble()*2-1.0;}
if(py < ymin){dy=rm.nextDouble(); dx=rm.nextDouble()*2-1.0;}
if(ymax < py){dy=-rm.nextDouble(); dx=rm.nextDouble()*2-1.0;}
}
public void paint(Graphics g)
{ Color cc=g.getColor();
g.setColor(color);
g.fillOval((int)px,(int)py,30,30);
g.setColor(cc);
}
}
ABall クラス
Random… 乱数発生クラス. java.util.* パッケー
ジを import する必要あり.
rm.nextDowble() … 次の, 0 から 1 までの
double 値の乱数を返す.
g.getColor() … 現在の描画色を返す.
g.setColor(Color) … 描画色を Color にする.
advance() … 次のボールの位置の計算. 壁
に当たったら, random な方向に反射さ
せる.
3-2. 動かないアプレット
プログラム4.
public class MoveBall1 extends java.applet.Applet {
ABall b1;
boolean eol; // もし真なら、ループの実行を終了
public void init() { b1=new ABall( 50,50,Color.red); eol=false;}
public void start() { run();}
public void run(){
System.out.println("run start");
while(!eol){
System.out.println("while loop"); advance(); repaint();
try{ Thread.sleep(20);} catch(InterruptedException e){} }}
public void stop()
{ eol=true; } // 停止のとき実行
public void advance() { b1.advance(); }
public void paint(Graphics g) { b1.paint(g); }
}
動かないアプレット
start() … 初期化後, アプレット開始のためブラ
ウザ側から呼び出される. ここでは run を実行す
る.
run() … while ループ内で, ボールの移動と描
画を繰り返す. ところが, ブラウザには何も表示さ
れない.
stop() … アプレット停止のためブラウザ側から
呼び出される. これが呼び出されると, run() を終
了させる.
動かないアプレット
Thread.sleep(20) … 20 m 秒, 実行を停止する.
sleep は, 割り込み例外(エラー)が発生したとき,
InterruptedException という型の例外オブジェクトを
「投げる」. static メソッド. C の関数のように利用可
try{処理} catch(Exception e){例外処理}
… 例外が発生する可能性のある処理を行い, もし
例外が発生したら例外処理を行う.
3-3. 動くアプレット… Thread の利用
public class MoveBall2 extends java.applet.Applet
プログラム5.
implements Runnable{
ABall b1;
Thread me;
public void init() {
b1=new ABall(30,30,Color.red); me=new Thread(this); me.start();
}
public void run(){
while(me!=null){
advance(); repaint();
try{ Thread.sleep(20);} catch(InterruptedException e){}}
}
public void stop()
{ me=null; }
public void advance()
{ b1.advance(); }
public void paint(Graphics g) { b1.paint(g); }
}
動くアプレット
implements Runnable … このアプレットを新しい
制御 Thread として動かすために Runnable 「イ
ンターフェース」を付ける. メソッド run を定義し
なければならない.
Thread me … Thread クラスの変数 me の宣言,
me=new Thread(this) … me にこのアプレット
(this)の Thread を代入する.
me.start() … me を新しい制御 Thread として開始.
start() は run() を呼ぶ. Applet の start とは別.
4.アプレットの改良
4-1 複数のボールを動かす(1)
4-2 複数のボールを動かす(2)
4-2 複数の形を動かす … extend, 継承
4-4 マウスのクリックでボールを起動、停止させる
プログラム 9
4-3 オーバーライディングによるメソッドの修正
プログラム 10.
4-4 ダブルバッファリングによるちらつき解消
プログラム 11.
複数のボールを動かす
4-1 複数のボールを動かす(1)
プログラム 6.
public class Balls1 extends java.applet.Applet implements Runnable{
ABall b1,b2,b3;
Thread me;
public void init() {
個別に扱うのは大変
me=new Thread(this);
ABall クラスから
b1=new ABall(30,30,Color.red);
3つのオブジェクトを
b2=new ABall(80,200,Color.blue);
b3=new ABall(100,100,Color.yellow); 生成
me.start(); }
public void run(){
while(true){
advance(); repaint();
try{ me.sleep(20);} catch(InterruptedException e){}
}
}
複数のボールを動かす (1)(2/2)
public void stop() { me=null; }
public void advance()
{ b1.advance(); b2.advance(); b3.advance();}
public void paint(Graphics g)
{ b1.paint(g); b2.paint(g); b3.paint(g); }
}
個別に扱うのは大変
4-2 複数のボールを動かす(2)
プログラム 7.
public class Balls2 extends java.applet.Applet
implements Runnable{
Vector balls;
オブジェクトの配列に利用.
Thread me;
複数のオブジェクトをこの配列にまとめる
int nballs;
public void init() {
me=new Thread(this);
balls=new Vector();
balls.addElement(new ABall(30,30,Color.red));
balls.addElement(new ABall(80,200,Color.blue));
balls.addElement(new ABall(100,100,Color.yellow));
balls.addElement(new ABall(20,100,Color.black));
balls.addElement(new ABall(100,20,Color.green));
balls.addElement(new ABall(40,70,Color.white));
nballs=6;
オブジェクトを追加する,
me.start();
配列の大きさは自動的に変わる
}
複数のボールを動かす (2) (2/2)
public void run(){
while(true){
advance(); repaint();
try{ me.sleep(20);} catch(InterruptedException e){}
}
}
i 番目のオブジェクト
public void stop() { me=null; }
public void advance()
{ int i; for(i=0;i < nballs;i++)
((ABall)(balls.elementAt(i))).advance(); }
public void paint(Graphics g)
{ int i; for(i=0;i < nballs;i++)
((ABall)(balls.elementAt(i))).paint(g); }
}
キャスト
4-3 複数の形を動かす … extend, 継承
プログラム8.
複数の形を動かす …. 形クラス定義の追加部分
class ARect extends ABall{
public ARect(int x, int y, Color c){ init(x,y,c);}
public void paint(Graphics g)
{ Color cc=g.getColor();
g.setColor(color);
g.fillRect((int)px,(int)py,30,30); g.setColor(cc);
}
ABall の継承(copyに類似)
} 矩形の塗りつぶし表示
class Hello extends ABall{
public Hello(int x, int y, Color c){ init(x,y,c);}
public void paint(Graphics g)
{ Color cc=g.getColor(); g.setColor(color);
g.drawString("Hello.",(int)px,(int)py);
g.setColor(cc);
}
文字列の表示
}
複数の形を動かす … アプレットの初期化部分
public class Figs extends java.applet.Applet
implements Runnable{
Vector figs;
int nfigs;
Thread me;
public void init() {
me=new Thread(this);
nfigs=5; figs=new Vector(nfigs);
figs.addElement(new ABall(30,30,Color.red));
figs.addElement(new ABall(80,200,Color.blue));
figs.addElement(new ABall(100,100,Color.yellow));
figs.addElement(new ARect(150,250,Color.blue));
figs.addElement(new Hello(200,200,Color.green));
me.start();
}
…. balls->figs, nballs->nfigs
4-3 オーバーライディングによるメソッドの修正
プログラム 10.
4-4 ダブルバッファリングによるちらつき解消
プログラム 11.
5.市販開発環境の利用
5-1 GUI をドラッグ&ドロップで作成
プログラム 12
5-1 Access をアクセスするアプレットの開発
5-2 絵を DB に保存できるお絵描きアプレット
5-1 GUI をドラッグ&ドロップで作成
TextField, Button, Label を ドラッグ & ドロップ
イベントの関連付け … イベント処理の半自動作成
クラス階層図
イベント処理メソッドの修正
実行
5-2 Access をアクセスするアプレットの開発
接続先になる Access の表の例
ODBC の設定
開発環境における java プログラム自動生成ツール
自動的に作成されたフォーム
実行
5-3 絵を DB に保存できるお絵描きアプレット
参考文献
 JAVA 実践プログラミング,O’REILLY
 JAVA スレッドプログラミング,
O’REILLY
 http://java.sun.com
 http://www.gamelan.com
 http://www.tobata.isc.kyutech.ac.jp/~yaman
oue/researches/java/