テキストに"あと何分です。"とか書いて、それを
ノートパソコンで見えるようにしていました。
これを自動化できないかと思い、groovyスクリプトを
書いてみました。
//ここから
//ウィンドウのサイズは自動では最大化しません。
//フォントの大きさはお好みで変更してください。
//動作環境
//Groovy Version: 1.0-jsr-05 JVM: 1.4.2_12-b03
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.text.*;
if (args.size() < 1) {
System.err.println("Usage timekeeper \"HH:mm\" [fontsize(default is 200)]");
System.exit(1);
}
// time to keep
SimpleDateFormat fmt = new SimpleDateFormat("HH:mm");
GregorianCalendar spcCldr = new GregorianCalendar();
spcCldr.setTime(fmt.parse(args[0]));
GregorianCalendar now = new GregorianCalendar();
now.set(Calendar.HOUR_OF_DAY, spcCldr.get(Calendar.HOUR_OF_DAY));
now.set(Calendar.MINUTE, spcCldr.get(Calendar.MINUTE));
now.set(Calendar.SECOND, 0);
now.set(Calendar.MILLISECOND, 0);
Date time = now.getTime();
// fontsize
int fontsize = 200
if (args.size() == 2) {
fontsize = Integer.parseInt(args[1]);
}
// label
List lList = new ArrayList();
lList.add(new JLabel(""));
lList.add(new JLabel(""));
JFrame f = new JFrame();
class MyWindowAdapter extends WindowAdapter {
public void windowClosing(WindowEvent e) {
e.getSource().getGraphics().dispose();
System.exit(0);
}
}
f.addWindowListener(new MyWindowAdapter() )
f.setSize(800,600);
gb = new GridBagLayout();
f.getContentPane().setLayout(gb);
gc = new GridBagConstraints();
gc.gridwidth = gc.REMAINDER;
gc.gridheight = 1;
for (i in 0..<lList.size()) {
JLabel lbl = (JLabel)lList.get(i);
lbl.setFont(new Font(null,Font.BOLD, fontsize));
gb.setConstraints(lbl, gc);
f.getContentPane().add(lbl);
}
f.setVisible(true);
class MyThread extends Thread {
List lList;
JFrame f;
Date time;
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
MyThread(List lList, JFrame f, Date time) {
this.lList = lList;
this.f = f;
this.time = time;
}
static final int SIXTY_SECONDS = 60;
static final int ONE_SECOND = 1000;
public void run() {
try {
synchronized(this) {
while(true) {
wait(ONE_SECOND);
int rest = (int)((time.getTime() - System.currentTimeMillis()) / ONE_SECOND);
if (rest < 0 ) {
lList.get(0).setText(sdf.format(time) + "です");
lList.get(1).setText(" ");
} else
if (rest < SIXTY_SECONDS ) {
lList.get(0).setText(sdf.format(time) + "まで");
lList.get(1).setText("あと" + rest + "秒");
} else
if (rest < SIXTY_SECONDS * 20) {
lList.get(0).setText(sdf.format(time) + "まで");
lList.get(1).setText("あと" + ((int)(rest / SIXTY_SECONDS) + 1)+ "分");
} else {
lList.get(0).setText("今は");
lList.get(1).setText(sdf.format(new Date()));
}
f.repaint();
}
}
} catch(Exception e) {
throw new RuntimeException(e);
}
}
};
println "time to keep is " + time;
println "current time is " + new Date();
MyThread t = new MyThread(lList, f, time);
t.start();
//ここまで
このスクリプトを適当にtimekeeper.groovyとかつけて、
"groovy.bat timekeeper.groovy "12:00""
と実行します。フォントを大きくしたい場合は、
"groovy.bat timekeeper.groovy "12:00" 250"
などとします。デフォルトの大きさは200です。
20分以内になると「あと~分」という表示になります。
インナークラスの書き方を調べるのに手間取って(
上のスクリプトではインナークラス使っていません。現状では書けないんでしょうか?
)2時間ぐらいかかりました。