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();
}
}