2002年2月24,26-28日 作成 関谷トップページへ
timer program for 発表会(Java アプリ)のブラウザでの実行 (

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

// ------------------------------
// *     timer program for 発表会   timer_apn.java(Java application)   *
// ------------------------------
//   applet & application program, 2002.2.23-24,26-28 KPC SPIT sekiya
//
// 使い方
//A.準備作業
//  1.ベルの間隔テストと調整: 最下部のスライダの左右のボタンをクリックしてテスト。
//  2.予鈴の間隔、発表時間、質疑時間をセット:下部のテキストフィールドにキーイン。	
//		(Enterキーを押したら、はじめて入力となり、上の窓で発表時間が変わる。)
//  3.開始するプログラム番号のキー入力:最初は1、その後は+1される。
//			しかし、午後に途中から始めた、順番を変えたときなどキー入力。(Enter要)
//
//B.発表中の作業(マウスのクリック。ベルの音が小さいので、本物で鳴らす必要があります)
//  4.プログラム番号に対応した発表者数の選択:発表時間が上の窓に表示される。
//  5.発表の開始:発表開始ボタンをクリック。記録が下の窓に小さく表示される。
//  6.発表の終わり:質疑開始ボタンをクリック。発表時間(秒数)と、終わりの時刻表示。
//  7.質疑の終わり:質疑終了ボタンをクリック。質疑時間(秒数)と、終わりの時刻表示。
//  (以後は、プログラム番号が+1されて、4からの繰返しです。)
//
//C.発表が終わっての作業(記録の整理)
//  8.最下部のメモ窓で、全記録を選択し、コピーする。 
//  9.メモ帳などを開き、貼り付ける。
//  10.「名前を付けて保存」します。
//  11.Excelを開き、先に保存したファイルを読み込む。ここで、カンマでの区切りを指定。
//  12.Excelの表を予稿集の目次ページなどとの編集して、印刷・保存。
//

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;

public class timer_apt extends Applet implements Runnable,  ActionListener,  AdjustmentListener {
	Thread th = null;
	Scrollbar sI;
	
	private TextArea  ta1,ta2, ta3;
	private TextField tf1,tf2, tfp1_tp1, tfp2_ts1, tfp3_tq, tf_inter;
	private Button bt1,bt2,bt3, bt4;
	long nin, prog_no, ts, tp, tq, ts1, tp1, tsa, tqa, ti;
	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;

	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鈴 ";
					two_bell();
					beep2 = true;
				} else if( dt_now >= dt_qa_end && beep3 != true) {
					ta_beep3 = "+3鈴 ";
					beep3 = true;
					getToolkit().beep();
					for (int i=0; i<5000000*ti; i++) beep3 = true;
					two_bell();
				}
				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 two_bell() {
		getToolkit().beep();
		for (int i=0; i<5000000*ti; i++) beep1 = true;
		getToolkit().beep();
	}
	public void stop() {	// スレッドの停止
		if (th != null) {
			th.stop();	th=null;
		}
	}

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

		nin = 1; prog_no = 1;
		ts = 7; ts1 = 7; tp = 2; tp1 = 2; tq=3;
//		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, 14);
		setFont(f);
		Panel para_rec = new Panel();
		para_rec.setLayout(new BorderLayout());
		Panel para = new Panel();
		Panel rec = new Panel();
		Panel rec_title = new Panel();

		rec_title.setLayout(new GridLayout(4,1));
		para_rec.setFont(f);
		para.setLayout(new FlowLayout());
		para_rec.setLayout(new BorderLayout());
		para.add(new Label("1鈴:発表終了の"));
		para.add(tfp1_tp1=new TextField(String.valueOf(tp1),1));
		para.add(new Label("分前 2鈴:一人の発表(分)"));
		para.add(tfp2_ts1=new TextField(String.valueOf(ts1),1));
		para.add(new Label("3鈴:質疑応答(分):"));
		para.add(tfp3_tq=new TextField(String.valueOf(tq),1));
		rec_title.add(new Label("時刻などのメモ用テキスト域"));
		rec_title.add(new Label("  (閉じる前に選択し、コピー後、"));
		rec_title.add(new Label("  メモ帳などに貼付けます。)"));

		Panel time_inter = new Panel();
		time_inter.add(new Label("2鈴の間隔調整の倍率設定(8前後、1〜20)とテスト"));
		ti = 8;
		time_inter.add(tf_inter = new TextField(String.valueOf(ti),2));
	    sI=new Scrollbar(Scrollbar.HORIZONTAL,8,10,1,30);
	    sI.setSize(100,10);
	    time_inter.add(sI);
	    sI.addAdjustmentListener(this);
		tf_inter.addActionListener(this); 


		rec.add(ta3=new TextArea(5,45));
		para_rec.add("North",para);
		para_rec.add("Center",rec);
		para_rec.add("West",rec_title);
		para_rec.add("South",time_inter);
		
		f =  new Font("Selif", Font.PLAIN, 28);
		setFont(f);
		
		add(new Label("プログラムNo.:"));
		add(tf1=new TextField(String.valueOf(prog_no),2));

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

		add(ta1=new TextArea(6,35));
		disp_total_time();

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

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

		tfp1_tp1.addActionListener(this); 
		tfp2_ts1.addActionListener(this); 
		tfp3_tq.addActionListener(this);

	}
	public void adjustmentValueChanged(AdjustmentEvent ae){
		if(ae.getAdjustable()==sI) {
			tf_inter.setText(" "+sI.getValue());
			ti = sI.getValue();
			two_bell();
		}
	}
	public boolean action(Event e, Object o) {	// 人数・ラジオボタンの処理
		if (e.target instanceof Checkbox) {
			String str = ((Checkbox)e.target).getLabel();
			nin = Integer.valueOf(str).intValue();
			disp_total_time();
		}
		return true;
	}	
	public void disp_total_time() {
			tp = tp1; ts = ts1 * nin;
			ta1.setText("発表+質疑応答時間 " + (ts + tq) + "(分)\n");
	}
	public void actionPerformed(ActionEvent e) {	// イベント処理

		if (e.getSource() == tf1) { 	// プログラム番号の設定(キー入力,Enter要)
			prog_no = Integer.valueOf(tf1.getText()).intValue();
		}

		if (e.getSource() == tfp1_tp1) { 	// tp1の設定(キー入力,Enter要)
			tp1 = Integer.valueOf(tfp1_tp1.getText()).intValue();
		}
		if (e.getSource() == tfp2_ts1) { 	// ts1の設定
			ts1 = Integer.valueOf(tfp2_ts1.getText()).intValue();
			disp_total_time();
		}
		if (e.getSource() == tfp3_tq) { 	// tqの設定
			tq = Integer.valueOf(tfp3_tq.getText()).intValue();
			disp_total_time();
		}

		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)+"(1鈴)";
			ta1.appendText(tm_yotei);
			tm_yotei = "\n発表終了予定: " + d_qa_start.toString().substring(11,19)+"(2鈴)";
			ta1.appendText(tm_yotei);
			tm_yotei = "\n質疑終了予定: " + d_qa_end.toString().substring(11,19)+"(3鈴)";
			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);
			ta3.appendText(msg);
		}
		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);
			ta3.appendText(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);
			ta3.appendText(msg);

			prog_no = prog_no + 1;		// プログラム番号の+1
			tf1.setText(String.valueOf(prog_no));	
			disp_total_time();
			ta_beep1 = ta_beep2 = ta_beep3 =" ";	// テキスト2での消去

			beep1 = beep2 = beep3 =false;	// ベルのフラグのリセット
			fstart = false;			// 次の発表の開始前
		}
		if (e.getSource() == bt4) { 	// 全員終了ボタンでの処理
			tf1.setText(" ");	
			ta1.setText(" ");
		}
		if (e.getSource() == tf_inter) { 	// bell間隔の倍率設定(キー入力,Enter要)
			int ti_i = Integer.valueOf(tf_inter.getText()).intValue();
			if(ti_i>=1 && ti_i <=20){		// 2002.2.28 変更時の範囲チェック追加
				ti = ti_i;
				sI.setValue((int)ti);
				two_bell();
			} else {
				tf_inter.setText(String.valueOf(ti));// 元にもどす
			}
		}
	}

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

		timer_apt w = new timer_apt();
		w.init();
		w.start();
		f.add(w,"Center");
		f.pack();
		f.setSize(620, 680);
		f.show();
	} 
}