[戻る]
01-----なにもしない最も簡単なJava Appletプログラム
//★確認 プレットクラスの描き方が分かったか?
/* */
/*<applet code="applet01" Width="240" Height="180" align="right">
</applet> */
//↑
//appletviewer applet01.javaで実行させる場合は必ず必要で、コンパイルしておく
import java.applet.*; //java.appletの直下にあるクラスを使えるようにする。
public class applet01 extends Applet {
//public void paint(java.awt.Graphics g){ g.drawString("Hello",50,50); }
//確認後に上記コメントを外す。
}
[戻る]
02-----色々と描画してみるアプレットプログラム
//★ Graphicsクラスの概要が分かったか? paintメソッドがどのようなものか?
/* */
import java.applet.*;
import java.awt.*;
public class applet02 extends Applet {
public void paint(Graphics g){//システムからの描画要求で呼ばれる
//背景サイズを取得
int w = this.getWidth();
int h = this.getHeight();
//背景を希望色塗りつぶし
g.setColor(new Color(0,255,255)); //シアン
g.fillRect(0,0,w,h);
//文字を指定位置へ描画
//デフォルトフォント、太字、18ポイントのフォントを用意
Font font = new Font(null,Font.BOLD,18);
g.setFont(font);
g.setColor(new Color(255,0,0)) ; //赤
g.drawString("幅:"+w, 10,20);
g.drawString("高さ"+h, 10,50);
//座標(20,100)と座標(120,102)間に線を描画する
g.setColor(new Color(0,0,255)) ; //青
g.drawLine(20,100,120,102);//線を描画
}
}
[戻る]
03-----画像を描画してみるアプレット
//画像を描画してみるアプレット
//★確認:画像の描画方法、initメソッドで、applet内の各種情報を初期設定します。
/* */
import java.applet.*;
import java.awt.*;
public class applet03 extends Applet {
Image image;
Font font;
public void paint(Graphics g) {
g.drawImage(image, 0, 0, this);//画像を表示
g.setFont(font);
g.drawString("heno.jpgの画像",20,20);
}
//このアプレット(applet04)がロードされる時に自動実行するメソッド(決まっている)
public void init() {
this.setBackground(new Color(0,255,255));
font = new Font("gothic",Font.ITALIC ,20); //font名は、その存在が場合だけで書かない方がよい
//このhtmlがある所と同じ所から、『heno.gif』のイメージを読み取る
java.net.URL basUrl = getDocumentBase();
image = this.getImage(basUrl, "heno.jpg");
//showStatus(basUrl.toString());//デバック用 ドキュメントがあるURLを表示
}
}
[戻る]
041-----前に作ったアプレットを再利用するアプレット
//★確認:04 01のapplet01を継承して、変更したアプレット extendsの意味がわかったか?
// initを再定義している。⇒オーバーライドとは?
/* */
import java.applet.*;
import java.awt.*;
import java.lang.*;
public class applet041 extends applet01 {
Font font;
public void init() { //このアプレット(applet04)がロードされる時に自動実行するメソッド(決まっている)
super.init();////継承元(親のクラス)をスーパークラスを初期化
this.setBackground(new Color(255,100,255));
font = new Font(null,Font.ITALIC ,20);
//this.setFont(font); //失敗する?
}
public void paint(Graphics g){
super.paint(g); //継承元(親のクラス)をスーパークラスと呼びこれで、親のメソッドが呼べる。
//以下は追加記述
g.setFont(font);
g.drawString("追加記述",50,100);
int x = 100;
int y = 90;
int d = 50;
g.drawLine(x+d,y-d,x-d,y+d); //右上から左下へ線描画
g.drawLine(x-d,y-d,x+d,y+d); //左上から右下へ線描画
}
}
[戻る]
042----自分で新しいメソッドを追加
★確認:自作メソッドの作り方⇒アプレットにdrawXを作る
/* */
import java.applet.*;
import java.awt.*;
import java.lang.*;
public class applet042 extends Applet {
public void init() { //このアプレット(applet04)がロードされる時に自動実行するメソッド(決まっている)
this.setBackground(new Color(100,255,100));
}
public void paint(Graphics g){
drawRhombus(g,100,140,10); //菱形塗りつぶし描画
this.drawX(g,60,150,5,new Color(255,0,0)); //×描画
this.drawX(g,30,100,30,new Color(0,0,255)); //×描画
drawRhombus(g,150,50,5); //菱形塗りつぶし描画
}
//gの描画属性で、(x,y)座標をへ×の描画のcの色で、rの2倍の長さで行う。
public void drawX(Graphics g,int x, int y,int r, Color c){//←追加したメソッド
Color back = g.getColor();//現在の色を記憶
g.setColor(c); //色をcへ変更
//中心からのx方向(またはy方向)の描画開始距離を求める
//int d = (int)Math.sqrt(r*r/2);
//java.lang.Double dd = new java.lang.Double(Math.sqrt(r*r/2));
//int d = dd.intValue();
int d = new java.lang.Double(Math.sqrt(r*r/2)).intValue();
g.drawLine(x+d,y-d,x-d,y+d); //右上から左下へ線描画
g.drawLine(x-d,y-d,x+d,y+d); //左上から右下へ線描画
g.setColor(back);//色を変更前に戻す。
}
//gの描画属性で、(x,y)座標を中心に菱形塗りつぶしを描画する。
public void drawRhombus(Graphics g,int x, int y,int r){//←追加したメソッド
int ax[] = new int [4]; //4個の配列を用意
int ay[] = new int [4];
ax[0] = x; //菱形の上座標
ay[0] = y - r;
ax[1] = x + r; //菱形の右座標
ay[1] = y;
ax[2] = x; //菱形の下座標
ay[2] = y + r;
ax[3] = x - r; //菱形の左座標
ay[3] = y;
g.fillPolygon(ax,ay,4); //塗り付き多角形描画
}
}
[戻る]
051-----機能を再利用する方法1⇒インスタンスに対する機能として定義する。
//★良くない! 次のapplet052の例にすべきであるが、なぜか分かったか?
// GUtility.java :-----------------------------------------------------------
import java.awt.*;
import java.lang.*;
public class GUtility { //グラフ ユーティリティ
//gの描画属性で、(x,y)座標をc中心に、x,y方向へdの変位を持つ始点、終点で描く。
public void drawX(Graphics g,int x, int y,int d){
g.drawLine(x+d,y-d,x-d,y+d); //右上から左下へ線描画
g.drawLine(x-d,y-d,x+d,y+d); //左上から右下へ線描画
}
//gの描画属性で、(x,y)座標を中心に菱形塗りつぶしを描画する。
public void drawRhombus(Graphics g,int x, int y,int d){
int ax[] = { x,x+d, x,x-d}; //4個の配列を初期化して用意
int ay[] = {y-d, y,y+d, y};
g.fillPolygon(ax,ay,4); //塗り付き多角形描画
}
}
//------------------------------------------------------------------------------
//上記のGUtiliy クラスにメソッドをまとめ、それを利用する。
/* */
import java.applet.*;
import java.awt.*;
public class applet051 extends Applet {
public void init() { //このアプレットがロード時に自動実行
this.setBackground(new Color(100,255,0));//背景
}
public void paint(Graphics g){
GUtility gu = new GUtility(); //オブジェクト用意しないと使えない。
g.setColor(new Color(255,0,0)); //赤
gu.drawX(g,60,150,5); //×描画
gu.drawRhombus(g,100,140,10); //菱形塗りつぶし描画
g.setColor(new Color(0,0,255)); //青
gu.drawX(g,30,100,30); //×描画
gu.drawRhombus(g,150,50,5); //菱形塗りつぶし描画
}
}
[戻る]
052-----機能を再利用する方法2⇒クラス共有(static)機能として定義する。方法1より良い!
// GUtility2.java :-----------------------------------------------------------
import java.awt.*;
import java.lang.*;
public class GUtility2 { //グラフ ユーティリティ
//gの描画属性で、(x,y)座標をc中心に、x,y方向へdの変位を持つ始点、終点で描く。
public static void drawX(Graphics g,int x, int y,int d){
g.drawLine(x+d,y-d,x-d,y+d); //右上から左下へ線描画
g.drawLine(x-d,y-d,x+d,y+d); //左上から右下へ線描画
}
//gの描画属性で、(x,y)座標を中心に菱形塗りつぶしを描画する。
public static void drawRhombus(Graphics g,int x, int y,int d){
int ax[] = { x,x+d, x,x-d}; //4個の配列を初期化して用意
int ay[] = {y-d, y,y+d, y};
g.fillPolygon(ax,ay,4); //塗り付き多角形描画
}
}
//-----------------------------------------------------------------------------
//GUtiliy2クラスへスタティックメソッドでまとめ、それを利用する。
/* */
import java.applet.*;
import java.awt.*;
public class applet052 extends Applet {
public void init() { //このアプレットがロードされる時に自動実行
this.setBackground(new Color(100,255,0));//背景変更
}
public void paint(Graphics g){
//GUtility2 gu = new GUtility(); ←生成の必要がない
g.setColor(new Color(255,0,0)); //赤
GUtility2.drawX(g,60,150,5); //×描画(クラス名で呼び出し)
GUtility2.drawRhombus(g,100,140,10); //菱形塗りつぶし描画(クラス名で呼び出し)
g.setColor(new Color(0,0,255)); //青
GUtility2.drawX(g,30,100,30); //×描画(クラス名で呼び出し)
GUtility2.drawRhombus(g,150,50,5); //菱形塗りつぶし描画(クラス名で呼び出し)
}
}
[戻る]
053-----機能を再利用する方法3⇒インスタンス内部情報に対する機能として定義する。
// XY.java :-----------------------------------------------------------
import java.awt.*;
// 座標のx,yを記憶するクラス(その座標を中心に描画するXメソッド)
public class XY {
int x; //x座標
int y; //y座標
//クラスと同じ名前で、戻り値型を指定しない特別なメソッド⇒コンストラクタ
public XY(int ix,int iy){ // new の生成時にだけ呼び出すもので、インスタンスの初期設定に使われる。
x = ix; //引数で設定する
y = iy;
}
//gの描画属性で、(x,y)座標をc中心に、x,y方向へdの変位を持つ始点、終点で描く。
public void drawX(Graphics g,int d){
g.drawLine(x+d,y-d,x-d,y+d); //右上から左下へ線描画
g.drawLine(x-d,y-d,x+d,y+d); //左上から右下へ線描画
}
//gの描画属性で、(x,y)座標を中心に菱形塗りつぶしを描画する。
public void drawRhombus(Graphics g,int d){
int ax[] = { x,x+d, x,x-d}; //4個の配列を初期化して用意
int ay[] = {y-d, y,y+d, y};
g.fillPolygon(ax,ay,4); //塗り付き多角形描画
}
}
// ----------------------------------------------------------------------------
//xとyの座標記憶用フィールドを持つXYクラスを作り、それを利用する。
/* */
import java.applet.*;
import java.awt.*;
public class applet053 extends Applet{
public void init() { //アプレットロードに自動実行
this.setBackground(new Color(100,255,0));//背景色
}
public void paint(Graphics g){
XY xy1 = new XY(60,150); //←座標でXYインスタンスを生成
XY xy2 = new XY(100,140); //←座標でXYインスタンスを生成
g.setColor(new Color(255,0,0)); //赤
xy1.drawX(g,5); //×描画)
xy2.drawRhombus(g,10); //菱形塗りつぶし描画
g.setColor(new Color(0,0,255)); //青
xy1.x = 30; //フィールド変更(位置変更)
xy1.y = 100;
xy1.drawX(g,30); //×描画
xy2.x = 150;//フィールド変更(位置変更)
xy2.y = 50;
xy2.drawRhombus(g,5); //菱形塗りつぶし描画
}
}
[戻る]
054-----機能を再利用する方法4⇒既存クラスで利用できるクラスを探し、その派生クラスに作る。
// 座標x,yを記憶する既存のクラスPointを継承し、そのクラスにメソッドを定義する。
import java.awt.*; //Graphicsクラス参照用
import java.lang.*; //Pointクラス参照用
public class XY2 extends Point{
//継承したPointにあるx,yを使うので、フィールド宣言は不要
//クラスと同じ名前で、戻り値型を指定しない特別なメソッド⇒コンストラクタ
public XY2(int ix,int iy){ // new の生成時にだけ呼び出すもので、インスタンスの初期設定に使われる。
super(ix,iy); //親クラス(継承元java.lang.Point)のコンストラクタを実行
}
//gの描画属性で、(x,y)座標をc中心に、x,y方向へdの変位を持つ始点、終点で描く。
public static void drawX(Graphics g,int x, int y,int d){
g.drawLine(x+d,y-d,x-d,y+d); //右上から左下へ線描画
g.drawLine(x-d,y-d,x+d,y+d); //左上から右下へ線描画
}
//gの描画属性で、(x,y)座標を中心に菱形塗りつぶしを描画する。
public static void drawRhombus(Graphics g,int x, int y,int d){
int ax[] = { x,x+d, x,x-d}; //4個の配列を初期化して用意
int ay[] = {y-d, y,y+d, y};
g.fillPolygon(ax,ay,4); //塗り付き多角形描画
}
}
// ----------------------------------------------------------------------------
//xとyの座標を記憶するPointを継承したXY2クラスを作り、それを利用する。
/* */
import java.applet.*;
import java.awt.*;
public class applet054 extends Applet{
XY2 xy;
public void init() { //new の生成時に呼び出され、初期設定に使われる。
setBackground(new Color(100,255,0));
}
public void paint(Graphics g){
XY2 xy1 = new XY2(60,150); //←座標でXYインスタンスを生成
XY2 xy2 = new XY2(100,140); //←座標でXYインスタンスを生成
g.setColor(new Color(255,0,0)); //赤
xy1.drawX(g,5); //×描画)
xy2.drawRhombus(g,10); //菱形塗りつぶし描画
g.setColor(new Color(0,0,255)); //青
xy1.setLocation(30,100); //フィールド変更(位置変更)
xy1.drawX(g,30); //×描画
xy2.setLocation(150,50);//フィールド変更(位置変更)
xy2.drawRhombus(g,5); //菱形塗りつぶし描画
}
}
[戻る]
06-----クラスを再利用する例(同じファイルで作る:外部ファイルから見えないクラスになる)
/* */
//drawXで、×の描画でなく、◆描画を行える新しいクラスXYRを、XY2の継承で作る。
import java.applet.*;
import java.awt.*;//描画の場合は、java.awt.クラスを使えるようにする必要がある。
import java.awt.event.*; //MouseListenerインターフェイスを使う。
class XYR extends XY2 { //以前に作ったXY2を継承して、菱形描画をdrawXで行えるクラスXYRを作る
public XYR(int ix,int iy){
super(ix,iy); //XY2のコンストラクタを実行
}
//drawX×描画を変更し、菱形描画を行うように再定義する。(オーバーライドと言う)
public void drawX(Graphics g,int d){
super.drawRhombus(g,d); //drawXで菱形描画へ変更
}
}
public class applet06 extends Applet implements MouseListener {
XY2 a[];
int count = 0; //初期化を伴うフィールド
public void init(){//アプレットがロードされた時に呼ばれる。
this.setBackground(new Color(100,255,255));
a = new XY2[10];
this.addMouseListener(this);
}
public void paint(Graphics g){//システムからの描画要求で呼ばれる
g.setColor(new Color(255,0,0));
for(int i = 0; i < a.length; i++){
if(a[i] != null){
a[i].drawX(g,5); //a[i]がXY2クラスなら×、XYRクラスなら◆を描画
}
}
}
public void mouseClicked(MouseEvent e){
int x = e.getX(); //マウスクリックイベントが発生した位置を取得
int y = e.getY();
int status = e.getModifiers(); //状態を取得
this.showStatus(""+status+","+e.BUTTON1_MASK);
if((status & e.BUTTON1_MASK) != 0){ //左ボタン?
a[count++] = new XY2(x,y); //座標オブジェクトXY2生成
}else if((status & e.BUTTON3_MASK) != 0){ //右ボタン
a[count++] = new XYR(x,y); //座標オブジェクトXYR生成
}
this.repaint(); //再描画指示
}
public void mousePressed(MouseEvent e){showStatus("Pressed"); }
public void mouseReleased(MouseEvent e){showStatus("Released");}
public void mouseEntered(MouseEvent e){showStatus("Entered");}
public void mouseExited(MouseEvent e){showStatus("mouseExited");}
}
[戻る]
061---クラスの中でクラスを定義する(インナークラスと呼ぶ)
//
//applet06 で、XY2を再利用してXYRを定義した。
//XY2の『X』の描画をするdrawXメソッドを、XYRのdrawXメソッドでは、『◆』の描画をするように変更した。
//同じことを行わせるが、インナークラスでは、Colorのメンバを持たせ、マウスプレス時のテキストフィールド
//の赤色の情報を記憶し、その色で描画するように変更した。
//インナークラスでは、外側のクラスメンバを容易にアクセスできる所に注目のこと。
/* */
//drawXで、×の描画でなく、◆描画を行える新しいクラスXYRを、XY2の継承で作る。
import java.applet.*;
import java.awt.*;//描画の場合は、java.awt.クラスを使えるようにする必要がある。
import java.awt.event.*; //MouseListenerインターフェイスを使う。
public class applet061 extends Applet implements MouseListener {
TextField txt_red;
XY2 a[];
int count = 0; //初期化を伴うフィールド
class XYR extends XY2 { //以前に作ったXY2を継承して、菱形描画をdrawXで行えるクラスXYRを作る
Color color;
public XYR(int ix,int iy){
super(ix,iy); //XY2のコンストラクタを実行
int red = Integer.parseInt(txt_red.getText()); //テキストフィールドの文字を数字へ
applet061.this.showStatus(String.valueOf(red)); //←インナークラス内から外側のthisを指定する方法
color = new Color(red,0,0);
}
//drawX×描画を変更し、菱形描画を行うように再定義する。(オーバーライドと言う)
public void drawX(Graphics g,int d){
g.setColor(this.color);
super.drawRhombus(g,d); //drawXで菱形描画へ変更
}
}
public void init(){//アプレットがロードされた時に呼ばれる。
this.setBackground(new Color(100,255,255));
a = new XY2[10];
add(txt_red = new TextField("200")); //テキストフィールド生成
this.addMouseListener(this);
}
public void paint(Graphics g){//システムからの描画要求で呼ばれる
for(int i = 0; i < a.length; i++){
if(a[i] != null){
a[i].drawX(g,5); //a[i]がXY2クラスなら×、XYRクラスなら◆を描画
}
}
}
public void mousePressed(MouseEvent e){
int x = e.getX(); //マウス・プレス・イベントが発生した位置を取得
int y = e.getY();
a[count++] = new XYR(x,y); //座標オブジェクトXYR生成
this.repaint(); //再描画指示
}
public void mouseClicked(MouseEvent e){ }
public void mouseReleased(MouseEvent e){ }
public void mouseEntered(MouseEvent e){ }
public void mouseExited(MouseEvent e){ }
}
[戻る]
062---在るクラス(XYR)を継承した無名クラス(インナークラスと同じ性質)を定義して利用する
/* */
//drawXで、×の描画でなく、◆描画を行える新しいクラスXYRを、XY2の継承で作る。
import java.applet.*;
import java.awt.*;//描画の場合は、java.awt.クラスを使えるようにする必要がある。
import java.awt.event.*; //MouseListenerインターフェイスを使う。
public class applet062 extends Applet implements MouseListener {
TextField txt_red;
XY2 a[];
int count = 0; //初期化を伴うフィールド
int cx;
int cy;
class XYR extends XY2 {
Color color;
applet062 that;
public XYR(int ix,int iy){//コンストラクタ
super(ix,iy); //XY2のコンストラクタを実行
int red = Integer.parseInt(txt_red.getText());//文字列を数字へ
applet062.this.showStatus(String.valueOf(red));
//^^^^^^インナークラス内から外側のthisを指定する方法
color = new Color(red,0,0);
}
public void drawX(Graphics g,int d){
g.setColor(this.color);
super.drawRhombus(g,d); //drawXで菱形描画へ変更
}
public XYR() { //引数なしのコンストラクタを無理やり追加
super(0,0);
that = applet062.this; //←インナークラス内から外側のthisを指定する方法
setXYR();
}
void setXYR(){ //派生クラスでコンストラクタ内を変更できるようにする細工
x = cx;
y = cy;
int red = Integer.parseInt(txt_red.getText()); //テキストフィールドの文字を数字へ
applet062.this.showStatus(String.valueOf(red));
color = new Color(red,0,0);
}
}
public void init(){//アプレットがロードされた時に呼ばれる。
this.setBackground(new Color(100,255,255));
a = new XY2[10];
add(txt_red = new TextField("200")); //テキストフィールド生成
this.addMouseListener(this);
}
public void paint(Graphics g){//システムからの描画要求で呼ばれる
for(int i = 0; i < a.length; i++){
if(a[i] != null){
a[i].drawX(g,5); //a[i]がXY2クラスなら×、XYRクラスなら◆を描画
}
}
}
public void mousePressed(MouseEvent e){
cx = e.getX(); //マウス・プレス・イベントが発生した位置を取得
cy = e.getY();
a[count++] = new XYR(){ // 無名オブジェクト(applet61での名前:XYR)生成
//drawX×描画を変更し、菱形描画を行うように再定義する。(オーバーライド)
public void drawX(Graphics g,int d){
g.setColor(this.color);
super.drawRhombus(g,d); //drawXで菱形描画へ変更(オーバーライド)
}
void setXYR(){//XYRのsetXYRを変更する
x = that.cx; //x = cx;は、出来なかった!(cxは、外部の、また外側になる)
y = that.cy;
color = new Color(0,255,0);
}
};
this.repaint(); //再描画指示
}
public void mouseClicked(MouseEvent e){ }
public void mouseReleased(MouseEvent e){ }
public void mouseEntered(MouseEvent e){ }
public void mouseExited(MouseEvent e){ }
}
[戻る]
07 簡単なカード型データベース インターフェースの考える前の例
/* */
import java.applet.*;
import java.awt.*; //Graphics使用
import java.awt.event.*;//ActionListenerを使う
import java.util.*;//Vectorを使う
public class applet07 extends Applet {
TextField txtName; //名前入力用
Label lbl_idx;
public Vector v = new Vector(2);//初期要素数
int idx = 0; //現在の操作対象添え字
class MemoMember0 {//個人を記憶する
String name; //名前
//アドレスなど その他 色々あってよい。
}
public void set_idx(int i){ //表示中データをi番目へ記憶する命令
MemoMember0 obj = new MemoMember0();
obj.name = txtName.getText();
v.set(i,obj);//iの位置にある要素を、objで置き換え!
}
public void get_idx(int i){ //i番目の記憶内容を表示する命令
MemoMember0 obj = (MemoMember0) v.get(i);
if(obj != null){
txtName.setText(obj.name);
} else {
txtName.setText("xxxx");
}
lbl_idx.setText("idx:"+ i);
}
public void goNext(){//次の位置へ進む
set_idx(idx); //表示内容を記憶
idx++;
if(idx >= v.size()){
v.setSize(idx+1);//(idx+1)の添え字を使える容量まで増やす
//内部で、ensureCapacityメソッドが実行されている。
}
get_idx(idx); //記憶内容を表示
showStatus("size:" + v.capacity());//デバック確認用
}
public void goBack(){//前の位置へ進む
set_idx(idx); //表示内容を記憶
if(idx > 0) {
idx--;
}
get_idx(idx); //記憶内容を表示
}
public void init(){//アプレットがロードされた時に呼ばれる。
v.add(null); //先頭データをダミーで追加
Button btnBack,btnNext;
setBackground(new Color(200,200,200));
add(btnBack = new Button("←戻る"));
add(txtName = new TextField("xxxx",20));
add( lbl_idx = new Label("idx: 0"));
add(btnNext = new Button("次へ→"));
btnNext.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
goNext();
}
});
btnBack.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
goBack();
}
});
}
}
[戻る]
071 簡易カード型データベース2 自作インターフェイスを使う
//集合体のi番目要素と画面の関係を取り持つインターフェースを作る。
// applet07 のメソッドをインターフェースにしている。
public interface GUIOperator { //画面周りの操作用インターフェイス
public void set_idx(int i); //表示中データをi番目へ記憶する命令
public void get_idx(int i); //i番目の記憶内容を表示する命令
//void xyz(){} //インタフェースメソッドが本体を持つことはできない
}
//-------------------------------------------------------------------------------
//集合管理クラス 内部にVectorメンバと、現在のアクセス要素を指すidxを持つものとして設計
import java.util.*;// Vector 利用のため
public class Aggregation { //集合体
GUIOperator operator;
public Vector v = new Vector(2);//初期要素数
int idx = 0; //現在の操作対象添え字
public Aggregation(){ //コンストラクタ
v.add(null); //先頭データをダミーで追加
}
public void addOperator(GUIOperator obj){ // add○×△Listenerに対応するメソッド
operator = obj; //オペレーションしてくれるオブジェクトをセット
}
public void goNext(){//次の位置へ進む
operator.set_idx(idx); //表示内容を記憶
idx++;
if(idx >= v.size()){
v.setSize(idx+1);//(idx+1)の添え字を使える容量まで増やす
//内部で、ensureCapacityメソッドが実行されている。
}
operator.get_idx(idx); //記憶内容を表示
}
public void goBack(){//前の位置へ進む
operator.set_idx(idx); //表示内容を記憶
if(idx > 0) {
idx--;
}
operator.get_idx(idx); //記憶内容を表示
}
}
//----------------------------------------------------------------------------------------
//簡易カード型データベース2 自作インターフェイスを使ったアプレット
/* */
import java.applet.*;
import java.awt.*; //Graphics使用
import java.awt.event.*;//
public class applet071 extends Applet implements GUIOperator{
TextField txtName; //名前入力用
Label lbl_idx;
Aggregation 集合体 = new Aggregation(); //GUIOperatorを使う集合体
class MemoMember0 {//個人を記憶する
String name; //名前
}
public void set_idx(int i){ //表示中データをi番目へ記憶する命令
MemoMember0 obj = new MemoMember0();
obj.name = txtName.getText();
集合体.v.set(i,obj);//iの位置にある要素を、objで置き換え!
}
public void get_idx(int i){ //i番目の記憶内容を表示する命令
MemoMember0 obj = (MemoMember0) 集合体.v.get(i);
if(obj != null){
txtName.setText(obj.name);
} else {
txtName.setText("xxxx");
}
lbl_idx.setText("idx:"+ i);
}
public void init(){//アプレットがロードされた時に呼ばれる。
Button btnBack,btnNext;
setBackground(new Color(200,200,200));
add(btnBack = new Button("←戻る"));
add(txtName = new TextField("xxxx",20));
add( lbl_idx = new Label("idx: 0"));
add(btnNext = new Button("次へ→"));
btnNext.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
集合体.goNext();
}
});
btnBack.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
集合体.goBack();
}
});
集合体.addOperator(this);// addActionListenerに対応する
}
}
[戻る]
08---例外処理 その1 エラーを回避する方法(数値以外の入力、配列範囲外の添え字アクセス)
//着目点 どんな種類のエラーになるか? どうやって実行エラーを無くすか?
/* */
import java.applet.*; //Applet利用のため
import java.awt.*; //TextFieldなど利用のため
import java.awt.event.*;//ActionListener利用のため
//import java.lang.*; //Exception利用のため
public class applet08 extends Applet implements ActionListener{
TextField txt1,txt2,txt3,txt4;
double data[] = new double[3];
public void init(){//アプレットがロードされた時に呼ばれる。
Button btn = new Button("=");
this.add(txt1 = new TextField("100.0"));
this.add(new Label("÷"));
this.add(txt2 = new TextField("0.0"));
this.add(btn);
this.add(new Label("data["));
this.add(txt3 = new TextField("2"));
this.add(new Label("]"));
this.add(txt4 = new TextField("結果:",40));
btn.addActionListener(this);
}
public void actionPerformed(ActionEvent e){
try {
double d1 = Double.parseDouble(txt1.getText());
double d2 = Double.parseDouble(txt2.getText());
int i = Integer.parseInt(txt3.getText());
data[i] = (int)d1 / (int)d2;
//data[i] = d1 / d2;
if(Double.isInfinite(data[i])){
txt4.setText("無限大で計算できません");
} else {
txt4.setText("" + data[i]);
}
}
catch(ArrayIndexOutOfBoundsException e0){
txt4.setText(" 添え字入力値を訂正ください");
}
catch(NumberFormatException e1){
txt4.setText(" 数値を入力ください");
}
catch (Exception ex){ //その他のエラー
txt4.setText(ex.toString());
}
}
}
[戻る]
---
---