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