[戻る]

60---簡易カード型データベース 自作インターフェイスを使った応用

//applet071で作成した GUIOperatorインターフェイスと、Aggregationクラスを利用して作る。
/* 
   */
import java.applet.*;
import java.awt.*; //Graphics使用
import java.awt.event.*;//

public class applet60 extends Applet implements  GUIOperator{
	TextField txtName;	//名前入力用
	TextField txtAddr;	//アドレス入力用
	Label lbl_idx;
	
	Aggregation 集合体 = new Aggregation();	//GUIOperatorを使う集合体
	
	class MemoMember0 {//個人を記憶する
		String name;	//名前
		String addr;	//アドレス
	}

	public void set_idx(int i){	//表示中データをi番目へ記憶する命令
		MemoMember0 obj = new MemoMember0();
		obj.name = txtName.getText();
		obj.addr = txtAddr.getText();
		集合体.v.set(i,obj);//iの位置にある要素を、objで置き換え!
		//本来なら、Aggregationにsetメソッドを作る。
	}

	public void get_idx(int i){	//i番目の記憶内容を表示する命令
		MemoMember0 obj = (MemoMember0) 集合体.v.get(i);
		//本来なら、Aggregationにgetメソッドを作る。
		if(obj != null){
			txtName.setText(obj.name);
			txtAddr.setText(obj.addr);		
		} 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( new Label("名前"));
		add(txtName = new TextField("xxxx",20));
		add( lbl_idx = new Label("idx: 0"));
		add(btnNext = new Button("次へ→"));
		add( new Label("アドレス"));
		add(txtAddr = new TextField("",40));
		
		btnNext.addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
						if(txtName.getText().equals("xxxx") == false ){
							集合体.goNext();
						}
				}
		});
		btnBack.addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
						if(集合体.idx != 0){
							集合体.goBack();
						}
				}
		});
		
		集合体.addOperator(this);// addActionListenerに対応する
	}
}

[戻る]

61 applet60をフレーム版に変更し、データをファイルに記憶できるよう変更


import java.awt.*; //ボタン使用
import java.awt.event.*;//WindowListenerなどの使用のため
import java.io.*;	//ファイル操作クラス用

public class frame0712 extends Frame implements  GUIOperator{
	TextField txtName;	//名前入力用
	Label lbl_idx;
	
	Aggregation 集合体 = new Aggregation();	//GUIOperatorを使う集合体
	
	class MemoMember0 {//個人を記憶する
		String name;	//名前
	}

	public frame0712() { //コンストラクタ (アプレットでないので、initメソッドは不要)
		setLayout(new FlowLayout()); //レイヤー変更
		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("次へ→"));
		setSize(430,70);
		setTitle("カードデータベースの骨組み2");
		
		btnNext.addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
						集合体.goNext();
				}
		});
		btnBack.addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
						集合体.goBack();
				}
		});
		
		集合体.addOperator(this);// addActionListenerに対応する
		
		addWindowListener( new WindowListener() { //リスナー登録:無名(匿名)クラスを使う
			public void windowOpened(WindowEvent e){ 
				try {
					//ファイル入力用バッファリングストリーム生成
					BufferedReader buffread = 
						new BufferedReader(new InputStreamReader(new FileInputStream("frame071.txt")));
					System.out.println("frame071.txtから読み取り開始");
					集合体.v.clear();//すべての要素を Vector から削除
					while(buffread.ready()){
						String s = buffread.readLine();
						System.out.println(s + "をファイルから読み取り");
						MemoMember0  member = new MemoMember0();
						member.name = s;
						集合体.v.add(member);	//集合に追加
					}
					buffread.close();
					System.out.println("読み取り終了");
					frame0712.this.get_idx(0);	//最初の表示
				}
				catch(Exception ew){
					System.out.println(ew.toString());//エラー表示
				}	
			}
			public void windowClosing(WindowEvent e){ 
				frame0712.this.dispose(); //ウィンドウ破棄(閉じて無くなる)
			}
			public void windowClosed(WindowEvent e){
				try{
					//ファイル出力用バッファリングストリーム生成
					BufferedWriter buffwrite = 
						new  BufferedWriter(new  OutputStreamWriter(new FileOutputStream("frame071.txt")));
					
					System.out.println("frame071.txtへの書き込み開始");
					for(int i = 0;i < 集合体.v.size(); i++){
						MemoMember0 member = (MemoMember0) 集合体.v.get(i);
						if(member != null){
							System.out.println(member.name + "を書き込み");
							buffwrite.write( member.name ); //ファイルへ書き込み
							buffwrite.newLine(); //ファイルへ改行を書き込む
						}
					}
					buffwrite.close();
				}
				catch(Exception ew){
					System.out.println(e.toString());//エラー表示
				}
			}
			public void windowIconified(WindowEvent e){ }
			public void windowDeiconified(WindowEvent e){ }
			public void windowActivated(WindowEvent e){ }
			public void windowDeactivated(WindowEvent e){ }
		} );
		
		show();  //これをコンストラクタの最終行に移動
	}

	public static void main(String argv[]){
		frame0712 p = new frame0712();//インスタンス生成
	}
	
	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);
	}
}



[戻る]

62 再利用可能な、よく使う簡単なメッセージボックス(モーダルダイアログ)を定義する

import java.awt.*;
import java.awt.event.*;//WindowListenerなどの使用のため

public class MessageBox extends Dialog implements ActionListener, WindowListener{
	public static final int MB_OK = 1; //スタイル
	
	public static final int IDOK = 10; //リターンコード
	public static final int IDCANCEL = 12;
	public static final int IDNO = 13;

	Button btnOk;
	int rtnCode = IDCANCEL; //リターンコード
	String rtnString = ""; //リターン文字列
	
	public MessageBox(Frame owner,String title){
		super(owner,title,true);//モーダルダイアログ指定
	}
	public static int  exec(Frame owner, String title, String msg ,int width,int height, int type){
		MessageBox p = new MessageBox(owner,title);
		if(type == MB_OK){
			p.setLayout(new FlowLayout()); //レイヤー変更
			p.add(new Label(msg));//メッセージ追加
			p.btnOk = new Button("OK");
			p.add(p.btnOk); //ボタン追加
			p.btnOk.addActionListener( p );
		}
		Point pt = owner.getLocationOnScreen();
		p.setLocation(pt.x,pt.y);
		p.setSize(width,height);
		p.show();
		return p.rtnCode;
	}
		
	public static int  exec(Frame owner, String title, String msg){
		return exec(owner, title, msg ,240,80,MB_OK);
	}
	
	public void actionPerformed(ActionEvent e){
		if(e.getSource() ==btnOk){
			rtnCode = IDOK;
			dispose();//上記showメソッドが終了することになる。
		}
	}

	public void windowOpened(WindowEvent e){ }
	public void windowClosing(WindowEvent e){ }
	public void windowClosed(WindowEvent e){ 
		dispose();//上記showメソッドが終了することになる。
	}
	public void windowIconified(WindowEvent e){ }
	public void windowDeiconified(WindowEvent e){ }
	public void windowActivated(WindowEvent e){ }
	public void windowDeactivated(WindowEvent e){ }
}



[戻る]

63---再利用可能な、よく使う簡単な入力用ボックスを定義する


import java.awt.*;
import java.awt.event.*;//WindowListenerなどの使用のため

public class InputBox extends Dialog implements ActionListener, WindowListener{

	public static final int IDOK = 10; //リターンコード
	public static final int IDCANCEL = 12;
	public static final int IDNO = 13;
	Button btnOk;
	TextField txt;
	int rtnCode = IDCANCEL; //リターンコード
	String rtnString = ""; //リターン文字列
	
	public InputBox(Frame owner,String title){
		super(owner,title,true);//モーダルダイアログ指定
	}
	public static int  exec(Frame owner, String title, String msg , StringBuffer data,int width,int height){
		InputBox p = new InputBox(owner,title);
		p.add(new Label(msg),BorderLayout.NORTH);//メッセージ追加
		p.txt = new TextField(data.toString());
		p.add(p.txt,BorderLayout.CENTER);
		p.btnOk = new Button("OK");
		p.add(p.btnOk,BorderLayout.SOUTH); //ボタン追加
		p.btnOk.addActionListener( p );
		p.addWindowListener( p );
		Point pt = owner.getLocationOnScreen();//オーナーフレームと同じ位置に表示
		p.setLocation(pt.x,pt.y);
		p.setSize(width,height);
		p.show();	//モーダル指定Dialogの場合、disposeされるまで次に進まない。

		//以降は、dispose後(閉じられるか、OKボタンを押してから)に実行する。
		if(p.rtnCode == IDOK){
			data.replace(0,data.length(),p.rtnString);//引数のdata文字列(StringBuffer型)全体をsに置き換え
		}
		return p.rtnCode;
	}
		
	public static int  exec(Frame owner, String title, String msg,StringBuffer data){
		return exec(owner, title, msg ,data ,240,100);
	}
	
	public void actionPerformed(ActionEvent e){
		if(e.getSource() ==btnOk){
			rtnCode = IDOK;
			rtnString = txt.getText();
			dispose();//上記showメソッドが終了することになる。
		}
	}

	public void windowOpened(WindowEvent e){ }
	public void windowClosing(WindowEvent e){
				dispose();//上記showメソッドが終了することになる。
 	}
	public void windowClosed(WindowEvent e){ }
	public void windowIconified(WindowEvent e){ }
	public void windowDeiconified(WindowEvent e){ }
	public void windowActivated(WindowEvent e){ }
	public void windowDeactivated(WindowEvent e){ }
}


[戻る]

64---簡易型カードデータベース完成版

//Aggregation2で管理されることを前提にした専用クラスで、これ以外のフィールドは継承して使う。

public class Member implements Cloneable{ //名前を持つメンバー
	public String name;	//名前
	protected Object clone(){
		Member newobj = new Member();
		newobj.name = new String(name);
		return newobj;
	}
}
──────────────────────────
// ComareMemberName.java  これは、Memberのnameフィールド(Stringクラス)を比較する専用クラス
import java.util.*;
public class ComareMemberName implements Comparator {
	public int compare(Object a, Object b){
		Member ma = (Member) a;
		Member mb = (Member) b;
		if(mb == null) return -1;
		else if(ma == null) return 1;
		else return ma.name.compareTo(mb.name);//文字列同士の比較
	}
}
──────────────────────────
// Aggregationに対して、挿入、削除、検索、並び替えを追加したクラス
// Comparatorインターフェイスを利用し、Memberとその継承クラスを管理することを前提にした専用クラス
import java.util.*;
public class Aggregation2 extends Aggregation {
	public void insert(){//挿入
		Member srcObj = (Member) v.get(idx);
		Member newObj = (Member) srcObj.clone();//複製
		v.add(idx,newObj);
	}
	public void remove(){//削除
		if(v.size() == 1){ //1要素残しておきたいので・・
			v.set(0,null);
		} else {
			v.remove(idx);//削除
			if(idx > 0){
				idx--;
			}
		}
		operator.get_idx(idx);
	}
	public boolean serachName(String s){
		ComareMemberName cmp = new ComareMemberName();
		Member serach = new Member();
		serach.name = s;
		int i;
		for(i = idx; i < v.size(); i++){
			if(cmp.compare(serach,v.get(i)) == 0) break;
		}
		if(i == v.size()){
			return false; //見つからない
		} else {	
			idx = i;
			operator.get_idx(idx);
			return true;//見つかった。
		}
	}
	public void sortName(){
		ComareMemberName cmp = new ComareMemberName();
		Collections.sort(v,cmp);//Comparatorをインプリメントしてあれば、これでOK
		operator.get_idx(idx);
	}
}
──────────────────────────
/* jarファイル作成コマンド
●%JAVA_HOME%\bin\jar cmvf frame0713.txt frame0713.jar frame0713*.class Aggregation.class Aggregation2.class ComareMemberName.class Member.class GUIOperator.class MessageBox.class InputBox.class

●frame0713.txtの内容
Main-Class: frame0713
Class-Path: .
*/
/* frame0713.jarダウンロード

    
    
   */

import java.awt.*; //Graphics使用
import java.awt.event.*;//WindowListenerなどの使用のため
import java.io.*;	//ファイル操作クラス用
import java.util.*;

public class frame0713 extends Frame implements  GUIOperator{
	TextField txtName;	//名前入力用
	TextField txtAddress;	//アドレス入力用
	Label lbl_idx;
	
	Aggregation2 集合体 = new Aggregation2();	//GUIOperatorを使う集合体
	
	MenuBar mnuBar;	//メニューバー管理用
	Menu	menu;	//メニュー管理用
	MenuItem itemInseart, itemRemove, itemSearch, itemSort;		//メニュー項目
	
	class MemoMember0 extends Member  {//個人を記憶する
		//memoMemberのフィールドが多く存在する外部のpublicクラスにした方がよい.
		//また、フィールドが追加される場合は、cloneをオーバーライドする
		public String address ="";
		protected Object clone(){
			MemoMember0 newobj = new MemoMember0();
			newobj.name = new String(name);
			newobj.address = new String(address);
			return newobj;
		}
	}

	public frame0713() { //コンストラクタ (アプレットでないので、initメ;ソッドは不要)
		Panel panel = new Panel();
		add(panel, BorderLayout.NORTH);
		Button btnBack,btnNext;
		setBackground(new Color(200,200,200));
		panel.add(btnBack = new Button("←戻る"));
		panel.add(txtName = new TextField("xxxx",20));
		panel.add( lbl_idx = new Label("idx: 0"));
		panel.add(btnNext = new Button("次へ→"));
		add(txtAddress = new TextField(),BorderLayout.CENTER);
		setSize(430,100);
		setTitle("カードデータベースの骨組み2");
		
		setMenuBar(mnuBar = new MenuBar()); //メニューバー追加 
		mnuBar.add(menu = new Menu("操作"));//トップメニュー追加
		menu.add(itemInseart = new MenuItem("新規要素挿入"));//項目追加
		menu.add(itemRemove = new MenuItem("現在要素削除"));//項目追加
		menu.add(itemSearch = new MenuItem("名前検索"));//項目追加
		menu.add(itemSort = new MenuItem("並び替え"));//項目追加
		
		btnNext.addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
						集合体.goNext();
				}
		});
		btnBack.addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
						集合体.goBack();
				}
		});
		
		集合体.addOperator(this);// addActionListenerに対応する
		
		addWindowListener( new WindowListener() { //リスナー登録:無名(匿名)クラスを使う
			public void windowOpened(WindowEvent e){ 
				try {
					//ファイル入力用バッファリングストリーム生成
					BufferedReader buffread = 
						new BufferedReader(new InputStreamReader(new FileInputStream("frame071.txt")));
					System.out.println("frame071.txtから読み取り開始");
					集合体.v.clear();//すべての要素を Vector から削除
					while(buffread.ready()){
						String s = buffread.readLine();
						System.out.println(s + "をファイルから読み取り");
						MemoMember0  member = new MemoMember0();
						member.name = s;
						s = buffread.readLine();
						System.out.println(s + "をファイルから読み取り");
						member.address = s;
						集合体.v.add(member);	//集合に追加
					}
					buffread.close();
					System.out.println("読み取り終了");
					if(集合体.v.size() == 0) 集合体.v.setSize(1); //---------------------6/5修正----------------------------------------
					frame0713.this.get_idx(0);	//最初の表示
				}
				catch(Exception ew){
					System.out.println(ew.toString());//エラー表示
				}	
			}
			public void windowClosing(WindowEvent e){ 
				frame0713.this.dispose(); //ウィンドウ破棄(閉じて無くなる)
			}
			public void windowClosed(WindowEvent e){
				try{
					if(txtName.getText().compareTo("xxxx") != 0) set_idx(集合体.idx); //---------------6/5修正--------------
					//ファイル出力用バッファリングストリーム生成
					BufferedWriter buffwrite = 
						new  BufferedWriter(new  OutputStreamWriter(new FileOutputStream("frame071.txt")));
					
					System.out.println("frame071.txtへの書き込み開始");
					for(int i = 0;i < 集合体.v.size(); i++){
						MemoMember0 member = (MemoMember0) 集合体.v.get(i);
						if(member != null){
							System.out.println(member.name + "を書き込み");
							buffwrite.write( member.name ); //ファイルへ書き込み
							buffwrite.newLine(); //ファイルへ改行を書き込む
							System.out.println(member.address + "を書き込み");
							buffwrite.write( member.address ); //ファイルへ書き込み
							buffwrite.newLine(); //ファイルへ改行を書き込む
						}
					}
					buffwrite.close();
				}
				catch(Exception ew){
					System.out.println(e.toString());//エラー表示
				}
			}
			public void windowIconified(WindowEvent e){ }
			public void windowDeiconified(WindowEvent e){ }
			public void windowActivated(WindowEvent e){ }
			public void windowDeactivated(WindowEvent e){ }
		} );
		
		itemInseart.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){//新規要素挿入
				集合体.insert();
			}
		});
		itemRemove.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){//現在要素削除
				集合体.remove();
			}
		});
		itemSearch.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){//名前検索
				StringBuffer data = new StringBuffer("検索名");
				int code = InputBox.exec(frame0713.this,"入力","検索文字列入力", data);

				if(集合体.serachName(data.toString()) == false){
					MessageBox.exec(frame0713.this,"検索文字結果", "見つかりませんでした");
				}
			}
		});
		itemSort.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){//並び替え
				集合体.sortName();
			}
		});

		show();  //これをコンストラクタの最終行に移動
	}

	public static void main(String argv[]){
		new frame0713();//インスタンス生成
	}
	
	public void set_idx(int i){	//表示中データをi番目へ記憶する命令
		MemoMember0 obj = new MemoMember0();
		obj.name = txtName.getText();
		obj.address = txtAddress.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);
			txtAddress.setText(obj.address);
		} else {
			txtName.setText("xxxx");
			txtAddress.setText("");
		}
		lbl_idx.setText("idx:"+ i);
	}
}


[戻る]

65---簡単なスロットマシンっぽいもの(カウントダウンするパネルを別途に作って3つ配置する)

//インターフェイスの応用プログラム
public interface TimeObserver {//監視メソッドを予約
	public void update();//★★★
}
───────────────────────
//カウントダウンするパネル
import java.applet.*;
import java.awt.*;//各種部品の使用
import java.awt.event.*;//ActionEvent用
import java.lang.*;	//Tread用 

public class CountDownPanel extends Panel implements ActionListener  ,  Runnable  {
	TextField txtCount;	//表示用
	int counter = 9;	//カウンター9から0までダウンカウント
	Button btnStop;		//ストップボタン
 	Thread thread ; //スレッド管理用
	public boolean startFlag =false;
	TimeObserver observer; //監視者★★★
	public CountDownPanel(TimeObserver obs){//コンストラクタ
		observer = obs; //監視役登録★★★
		Button btnStart;
		setLayout(new BorderLayout());
		add(txtCount = new TextField("9",3),BorderLayout.NORTH);
		add(btnStop = new Button("STOP"));
		btnStop.addActionListener(this);//ストップボタン操作登録
		setSize(70,70);
	}
	public void setDownStart(int data){ //dataをセットしてカウントダウン開始
		startFlag = true;
		counter = data;
		txtCount.setText("" + counter);
		thread = new Thread(this);
		thread.start();
	}
	public void run(){
		while(startFlag) {
			try {
				Thread.sleep(300); //0.3秒間眠る
				if(counter == 0) counter = 9;	//0なら元の9に戻る
				else  counter--;
				txtCount.setText("" + counter);
			}
			catch(InterruptedException e){
				break;
			}
		}
		thread = null;//同期しないタイミングがあったので追加
	}
	public void actionPerformed (ActionEvent e){
		startFlag = false;
		while(thread != null)//同期しないタイミングがあったので追加
			; //何もしないで止まるのを待つ
		observer.update(); //通知★★★
	}
}
──────────────────────────────────────
//簡単なスロットマシン(カウントダウンするパネルを別途に作って3つ配置)jar内のアプレット起動指定
//インターフェイスの応用プログラム
/*
  */
/* jarファイル作成コマンド
%JAVA_HOME%\bin\jar cvf applet65.jar applet65.class TimeObserver.class CountDownPanel.class
*/

import java.applet.*;
import java.awt.*; //Graphics使用
import java.awt.event.*;//

public class applet65 extends Applet implements  ActionListener,TimeObserver{
	CountDownPanel unit[] = new CountDownPanel[3];
	Button startBtn;
	TextField msg; //メッセージ用
	public void init(){//アプレットがロードされた時に呼ばれる。
		setLayout(new BorderLayout());
		Panel panel = new Panel();
		add(panel, BorderLayout.NORTH);
		panel.add(unit[0] = new CountDownPanel(this));//監視役がthis
		panel.add(unit[1] = new CountDownPanel(this));
		panel.add(unit[2] = new CountDownPanel(this));
		add(startBtn = new Button("START"),BorderLayout.CENTER);
		add(msg = new TextField("START押して"),BorderLayout.SOUTH);
		startBtn.addActionListener(this);	
	}
	public void actionPerformed(ActionEvent e){
		for(int i = 0; i < unit.length; i++){
			int r = (int)(java.lang.Math.random() * 10);//乱数0〜9を生成
			unit[i].setDownStart(r);//乱数を初期値にしてスタート
		}
		msg.setText("止めて数を合わる。うまくいくか?");
	}
	public void update(){	//止まったら通知される。★★★
		for(int i = 0; i < unit.length; i++){//全て止まったか?
			if(unit[i].startFlag == true) 
				return;//動いているなのがある。
		}
		for(int i = 1; i < unit.length; i++){//一致しているか?
			if(unit[0].counter != unit[i].counter) {
				msg.setText("はずれー! またチャレンジ");
				return;
			}
		}
		msg.setText("全て一致で、おめでとー! ");
	}
}


[戻る]

66---プログラム概要: 三角形を左右に動かすアニメーション(パッケージを利用)

作成されたtestMain.jar
//Stageフォルダを作成し、その中にこのソースファイルを置く。
//Stageフォルダがあるディレクトリをカレントディレクトリにし、次のコマンドで翻訳する。%JAVACEXE1%はjavacコマンドを意味する。
//『%JAVACEXE1% Stage\testMain.java』
//以上で、testMain.class とStage.classがStageフォルダの中に作成される。
//Stageフォルダの中にtestMain2.txtが存在し、次の内容であるとする。
/*
Main-Class: Stage/testMain
Class-Path: testMain.jar .
*/
//次のコマンドで、カレントディレクトリにtestMain.jarを作成する。
//『%JAVA_HOME%\bin\jar.exe cmvf Stage\testMain2.txt testMain.jar Stage\testMain.class Stage\Stage.class』

package Stage;
import java.awt.*;//各種部品
import java.awt.event.*; //WindowListener利用のため
import java.awt.image.*; //BufferedImage利用のため

class Stage extends Canvas implements Runnable{ //アニメーションなどの動画ステージ用
	public static int WIDTH = 320;
	public static int HEIGHT = 240;
	public static Color backColor =  new Color(200,200,200);
	public int paintCycle=10;  //描画サイクル(ミリ秒)
	public Thread thread = null;	//描画サイクル用スレッド
	Image image;		//画像管理用
	
	int x[] = {50,75,100};//三角形のポリゴン座標(x軸)
	int y[] = {50,20,50};// (y軸)
	int dx = 5;//移動速度
	
	
	public Stage(){
		this.setSize(WIDTH,HEIGHT);
		
		image = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);//画像生成

		this.thread = new Thread(this);
		this.thread.start();//スレッドスタート
	}
	public synchronized void update(Graphics g){ //画面をクリアせずに、paintを呼ぶスタイル
		paint(g);
	}
	
	public void paint(Graphics g){//システムからの描画要求で呼ばれる
		setImage(g);
	}
	
	public void setImage(Graphics g){
		Graphics graph = image.getGraphics();//imageに描画するためのGraphicsを取得
		graph.setColor(backColor);
		Dimension d = this.getSize();
		graph.fillRect(0,0,d.width, d.height);
		Color color = new Color(255,0,0);
		graph.setColor(color);
		graph.fillPolygon(x,y,x.length);
		g.drawImage(image, 0, 0, this);//記憶されるイメージを描画
	}
	
	public void run(){
		while(this.thread != null){
			try {
				Thread.sleep(paintCycle);
				
				for(int i = 0; i < x.length; i++){ //x[] 配列全体を変更
					x[i]+=dx;
				}
				if(x[0]>200 || x[0] < 0){
					dx = -dx;
				}
				
				this.repaint();
			}
			catch(Exception e){
				System.out.println(e.toString());
			}
		}
	}
}



public class testMain extends Frame implements WindowListener {//アニメーション用になるキャンバスの派生クラス
	
	Stage stage;	//アニメーション用
	static public void main(String argv[]){
		testMain m = new testMain();
		
	}
	
	public testMain(){
		stage = new Stage();
		add(stage);

		setLocation(100,100);//位置変更
		addWindowListener(this);//ウィンドウイベント処理インスタンス登録
		this.setSize(320,240);
		show();	//表示
	}

	public void windowOpened(WindowEvent e) {	//ウィンドウが最初に可視になった
	}
	
	public void windowClosed(WindowEvent e) { //ウィンドウがクローズされた
	}
	
	public void windowClosing(WindowEvent e) {//ユーザが、ステムメニュー(クローズボックスなど)でウィンドウを閉じた 
		stage.thread = null;
		this.dispose();	//すべてのネイティブスクリーンリソースを解放(ウインドウが無くなる)
	}
	public void windowIconified(WindowEvent e) {//ウィンドウが最小化された
	}
	public void windowDeiconified(WindowEvent e) {//他の状態から通常の状態になった
	}
	public void windowActivated(WindowEvent e) {//Window がアクティブ化 
	}
	public void windowDeactivated(WindowEvent e) { //Window がアクティブでなくなった 
	}
}
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送