2002年2月24日 作成 関谷トップページへ

timer program for 発表会(Java アプリ) ソースプログラム

// ------------------------------
// *     timer program for 発表会   timer_apn.java(Java application)   *
// ------------------------------
//   application program  with text file output, 2002.2.23-24 KPC SPIT sekiya
//		log_outoput() : method for file output

import java.applet.Applet;  // Javaの言語パッケージ類
import java.awt.*;
import java.awt.Toolkit;	// public abstract void beep()
import java.awt.event.*;
import java.lang.*;    		//
import java.lang.Math;		//  数学サブクラス
import java.lang.String;	//  ストリングクラス
import java.util.Date;
import java.util.TimeZone;
import java.io.*;


public class timer_apn extends Applet implements Runnable,  ActionListener {
	Thread th = null;
	
	private TextArea  ta1,ta2;
	private TextField tf1,tf2;
	private Button bt1,bt2,bt3, bt4;
	long nin, prog_no, ts, tp, tq, ts1, tp1, tsa, tqa;
	long dt_now, dt_sp_start, dt_sp_matome, dt_qa_start, dt_qa_end, dta_qa_start, dta_qa_end, sec;

	Date date_now, d_sp_start, d_sp_matome, d_qa_start, d_qa_end, da_qa_start, da_qa_end;
	private String ta_beep1, ta_beep2, ta_beep3, time_now, tm_yotei, msg;
	
	boolean fstart, beep1, beep2, beep3;	// フラグ(trueは開始後、鳴らした後)
	Font f;
	
	FileOutputStream fos;           // for Log file( needs "timer202.txt")
	static String logFileName;


	public void start() {	// スレッドの開始
		if (th == null) {
			th = new Thread(this);
			th.start();
		}
	}
	public void run() {	// スレッドでの無限ループ
		while(true) {
			date_now = new Date(); dt_now = date_now.getTime();

			time_now = "現在時刻:   " + date_now.toString().substring(11,19); 
			ta2.setText(time_now); 

			if( fstart) {
				if( dt_now >= dt_sp_matome && beep1 != true) {
					ta_beep1 = "予鈴 ";
					beep1 = true;
					getToolkit().beep();
				} else if( dt_now >= dt_qa_start && beep2 != true) {
					ta_beep2 = "+2鈴 ";
					beep2 = true;
					getToolkit().beep();
					for (int i=0; i<130000000; i++) beep2 = true;
					getToolkit().beep();
				} else if( dt_now >= dt_qa_end && beep3 != true) {
					ta_beep3 = "+3鈴 ";
					beep3 = true;
					getToolkit().beep();
					for (int i=0; i<120000000; i++) beep3 = true;
					getToolkit().beep();
					for (int i=0; i<120000000; i++) beep3 = true;
					getToolkit().beep();
				}
				time_now = "\n発表終わりまでの残り時間:" + String.valueOf((dt_qa_start - dt_now)/1000) + "(秒)"; 
				ta2.appendText(time_now);
				time_now = "\n質疑終わりまでの残り時間:" + String.valueOf((dt_qa_end - dt_now)/1000) + "(秒)\n"; 
				ta2.appendText(time_now);
				ta2.appendText(ta_beep1 + ta_beep2 + ta_beep3); 
			}

			try {
				th.sleep(1000);	// スレッドを1秒ごとに動かす
			}
			catch(InterruptedException e) {}
		}
	}
	public void stop() {	// スレッドの停止
		if (th != null) {
			th.stop();	th=null;
		}
	}

	public void init() {	// アプレッドの初期化
		setSize(500,350);

		nin = 1; prog_no = 1;
		ts = 10; ts1 = 10; tp = 2; tp1 = 2; tq=5;
//		ts = 2; ts1 = 2; tp = 1; tp1 = 1; tq=1;
		tm_yotei = " ";
		beep1 = beep2 = beep3 =true;	// ベルのフラグのセット(鳴らさない)
		fstart = false;			// 開始ボタンが押される前

		CheckboxGroup  ckgrp = new CheckboxGroup();
		Panel chkPanel = new Panel();
		chkPanel.setLayout(new GridLayout(1,4));
		chkPanel.add(new Checkbox("1", ckgrp,true));
		chkPanel.add(new Checkbox("2", ckgrp,false));
		chkPanel.add(new Checkbox("3", ckgrp,false));
		chkPanel.add(new Checkbox("4", ckgrp,false));
		
		f =  new Font("Selif", Font.PLAIN, 28);
		setFont(f);
		
		add(new Label("プログラムNo.:"));
		add(tf1=new TextField("1",2));

		add(new Label("人数=>"));
//		add(tf2=new TextField("1",1));
		add(chkPanel);
		
		add(bt1=new Button("発表開始"));
		add(bt2=new Button("質疑開始"));
		add(bt3=new Button("質疑終了"));
		add(bt4=new Button("全員終了"));

		add(ta1=new TextArea(6,35));
		ta1.setText("発表時間 " + (ts + tq) + "(分)\n");

		add(ta2=new TextArea(4,35));

		tf1.addActionListener(this); 
//		tf2.addActionListener(this); 
		bt1.addActionListener(this); 
		bt2.addActionListener(this); 
		bt3.addActionListener(this); 

		logFileName = "timer202.txt";
		try {               // Log file (このファイルが有れば、追加)
			fos = new FileOutputStream(logFileName, true);   // append file
		} catch (IOException ea) {
			try {               // Log file (ファイルを新規に作る)
				fos = new FileOutputStream(logFileName);   // open new file
			} catch (IOException eo) {
				System.out.println("IOException(make log):" + eo.getMessage());
				System.exit(1);
				return;
			}
			System.out.println("IOException(open log):" + ea.getMessage());
			System.exit(1);
			return;
		}
	}

	public boolean action(Event e, Object o) {	// 人数・ラジオボタンの処理
		if (e.target instanceof Checkbox) {
			String str = ((Checkbox)e.target).getLabel();
			nin = Integer.valueOf(str).intValue();
			tp = tp1* nin; ts = ts1 * nin;
			ta1.setText("発表時間 " + (ts + tq) + "(分)\n");
		}
		return true;
	}	

	public void actionPerformed(ActionEvent e) {	// イベント処理

		if (e.getSource() == tf1) { 	// プログラム番号の設定(キー入力,Enter要)
			prog_no = Integer.valueOf(tf1.getText()).intValue();
		}
//		if (e.getSource() == tf2) {	// 発表者人数(キー入力)から「ラジオボタン」に変更
//			nin = Integer.valueOf(tf2.getText()).intValue();
//			tp = tp1* nin; ts = ts1 * nin;
//			ta1.setText("発表時間 " + (ts + tq) + "(分)\n");
//		}

		if (e.getSource() == bt1) { 	// 発表の開始ボタンでの処理
			d_sp_start = new Date(); dt_sp_start = d_sp_start.getTime();
			dt_sp_matome =dt_sp_start + 60000 * (ts - tp);
			dt_qa_start =dt_sp_start + 60000 * ts;
			dt_qa_end =dt_sp_start + 60000 * (ts + tq);
			d_sp_matome = new Date();d_sp_matome.setTime(dt_sp_matome);
			d_qa_start = new Date();d_qa_start.setTime(dt_qa_start);
			d_qa_end = new Date(); d_qa_end.setTime(dt_qa_end);
			String tm_yotei = "発表開始時刻: " + d_sp_start.toString().substring(11,19);
			ta1.appendText(tm_yotei);
			tm_yotei = "\nまとめ開始予定:" + d_sp_matome.toString().substring(11,19);
			ta1.appendText(tm_yotei);
			tm_yotei = "\n質疑開始予定: " + d_qa_start.toString().substring(11,19);
			ta1.appendText(tm_yotei);
			tm_yotei = "\n質疑終了予定: " + d_qa_end.toString().substring(11,19);
			ta1.appendText(tm_yotei);

			ta_beep1 = ta_beep2 = ta_beep3 =" ";	// テキスト2での消去
			beep1 = beep2 = beep3 =false;	// ベルのフラグのリセット
			fstart = true;
			msg = "\nNo." + String.valueOf(prog_no) + ", (" + String.valueOf(nin) + "人), " + d_sp_start.toString().substring(11,19);
			System.out.print(msg);			// to command prompt 
			log_output(msg);				// to file
		}
		if (e.getSource() == bt2) { 	// 質疑の開始ボタンでの処理
			da_qa_start = new Date();dta_qa_start = da_qa_start.getTime();
			String tm_yotei = "\n質疑開始時刻: " + da_qa_start.toString().substring(11,19);
			ta1.appendText(tm_yotei);
			sec = (dta_qa_start - dt_sp_start)/1000;
			msg = ", "  + String.valueOf(sec) + ", " + da_qa_start.toString().substring(11,19);
			System.out.print(msg);
			log_output(msg);
		}
		if (e.getSource() == bt3) { 	// 質疑の終了のボタンでの処理
			da_qa_end = new Date(); dta_qa_end = da_qa_end.getTime();
			sec = (dta_qa_end - dta_qa_start)/1000;
			msg = ", "  + String.valueOf(sec) + ", " + da_qa_end.toString().substring(11,19);
			System.out.println(msg);
			log_output(msg);

			prog_no = prog_no + 1;		// プログラム番号の+1
			tf1.setText(String.valueOf(prog_no));	
//			ta1.setText("");		// テキスト域1の消去
			ta1.setText("発表時間 " + (ts + tq) + "(分)\n");	// 次の発表時間
			ta_beep1 = ta_beep2 = ta_beep3 =" ";	// テキスト2での消去

			beep1 = beep2 = beep3 =false;	// ベルのフラグのリセット
			fstart = false;			// 次の発表の開始前
		}
		if (e.getSource() == bt4) { 	// 全員終了ボタンでの処理
			tf1.setText(" ");	
			ta1.setText(" ");

			try {
				fos.close();			// ファイルを閉じる
			} catch (IOException ioe) {
				System.out.println("IOException(fos.close):" + ioe.getMessage());
				return;
			}
			System.exit(0);				// 終了する
		}
	}

	public static void main(String[] args) {	// アプリケーションでの処理
		Frame f = new Frame("発表会用 タイマー(Java Application) KPC SPIT");

		f.addWindowListener(new WindowAdapter() {		// 閉じるボタンでの終了
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		}); 

		timer_apn w = new timer_apn();		// appletのインスタンス作成
		w.init();
		w.start();
		f.add(w,"Center");
		f.pack();
		f.setSize(600, 500);
		f.show();
	} 
	
	void log_output(String string){     // log file output(for text editor or excel) csv file
		int i;
		byte[] b = new byte[256];
		for (i = 0; i<256; i++) b[i] =0;

		String str = string  ; //	+ (byte)0x0d + (byte)0x0a; 
		try {
			b = str.getBytes("SJIS");
		} catch (UnsupportedEncodingException ueo) {
			System.out.println("UnsupportedEncode at log:" + ueo.getMessage());
			return;
		}
		int obytes = b.length;
		try {
			fos.write(b, 0, obytes);
		} catch (IOException eo) {
			System.out.println("IOException at log:" + eo.getMessage());
			return;
		}
	}       

}