時限タイマーを作ってみよう3
ある処理を実現するプログラムの書き方は何通りもあります。
実行速度を優先する、とか、メモリ消費が少ないようにする、あるいは
プログラムの行数を少なくする、など目的によって、あるいは好みに
よって書き方が変わります。
毎度、管理人イガジーです。
それでも、基本はだいたい同じなので、ひな形(テンプレート)的な
ソースコードを元に積み上げてゆくのが効率的です。
という訳で、時限タイマーのメッセージを出す部分を
作ってゆきましょう。
class MsgBox extends Frame {
private static final long serialVersionUID = 1L;
Label lb;
Button btn;
MsgBox md;
public MsgBox(String message) {
super("Information");
md=this;
this.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent arg0) {
md.setVisible(false);
}
});
lb=new Label(message); // for message
lb.setFont(new Font(Font.DIALOG,Font.PLAIN,18));
lb.setAlignment(Label.CENTER);
this.add(lb,BorderLayout.CENTER);
btn=new Button(" OK ");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
md.setVisible(false);
}
});
Panel p2=new Panel();
p2.add(btn);
this.add(p2,BorderLayout.SOUTH);
this.setSize(340,140);
}
}// MsgBox
いきなりのソースコードですが、これは前回のclass VTimer1 {…} の中に置いてください(クラス内クラス)。
設定画面と同様にFrameを使っています。
普通はDialogにするのだと思いますがDialogだと、親窓を最小化した時に
Dialogも一緒に最小化されてしまうので、今回はFrameにしました。
Frame を使う場合に、前回のように
Frame f=new Frame();
と書く方法と、今回のように
class MsgBox extends Frame
と書く方法があります。
どちらでも良いのですが、両方の書き方を知っていただくために
両方併用します。
extends した場合、addやsetSizeなどは、frame.add(),
frame.setSize()等ではなくて、this.add(), this.setSize()
などになります。
MsgBoxの場合、窓を閉じるボタンがクリックされても
終了せずに、窓を閉じる(消す)だけなので
this.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent arg0) {
md.setVisible(false);
}
});
とします。
このMsgBoxを表示させるには
MsgBox alart;
alart=new MsgBox("テストです");
としておいて、
startbtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
alart.setVisible(true);
}
});
で、ボタンをクリックした時にalart.setVisible(true); します。
全体のコードは次のような感じです。
(前回と区別するためにクラス名をVTimer2にしています)
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Choice;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Panel;
import java.awt.Point;
import java.awt.TextField;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class VTimer2 {
Frame f;
MsgBox alart;
TextField msg,delay;
Button startbtn;
Choice unit;
VTimer2(){
f=new Frame("Set Timer 2");
f.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent arg0) {
System.exit(0);
}
});
alart=new MsgBox("テストです");
f.setLayout(new GridLayout(2,1));
Panel p0=new Panel();
p0.add(new Label("表示文"));
msg=new TextField("時間です",20);
p0.add(msg);
Panel p1=new Panel();
delay=new TextField(" 3",3);
p1.add(delay);
unit=new Choice();
unit.add("分後");
unit.add("秒後");
p1.add(unit);
startbtn=new Button(" Start ");
startbtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// alart.setVisible(true);
alart.visible();
}
});
p1.add(startbtn);
p1.add(new Label(" ")); // スペーサ
Button btn_end=new Button("End");
btn_end.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
p1.add(btn_end);
f.add(p0);
f.add(p1);
f.setSize(280,120);
f.setVisible(true);
}
class MsgBox extends Frame {
private static final long serialVersionUID = 1L;
Label lb;
Button btn;
MsgBox md;
public MsgBox(String message) {
super("Information");
md=this;
this.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent arg0) {
md.setVisible(false);
}
});
lb=new Label(message); // for message
lb.setFont(new Font(Font.DIALOG,Font.PLAIN,18));
lb.setAlignment(Label.CENTER);
this.add(lb,BorderLayout.CENTER);
btn=new Button(" OK ");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
md.setVisible(false);
}
});
Panel p2=new Panel();
p2.add(btn);
this.add(p2,BorderLayout.SOUTH);
this.setSize(340,140);
}
Point scenter(Dimension fsz) {
Dimension screensize=Toolkit.getDefaultToolkit().getScreenSize();
int x=(screensize.width-fsz.width)/2;
int y=(screensize.height-fsz.height)/2;
Point pos=new Point(x,y);
return pos;
}
void visible() {
Point cpos=scenter(md.getSize());
cpos.y-=40;
md.setLocation(cpos);
md.setVisible(true);
}
}// MsgBox
public static void main(String[] args) {
new VTimer2();
}
}
あれ? setVisible(true)じゃなくて visible()になってる
Point scenter(Dimension fsz) {…}なんてメソッドが増えてる
と気づいた方は鋭いですね。
はい、メッセージ窓(MsgBox)を画面中央に表示させるための処理を
(黙って)追加しました。
Dimension screensize=Toolkit.getDefaultToolkit().getScreenSize();
で、画面サイズを得ることができるので、そこから中央位置を
算出しています。
次回はこのメッセージボックスに、時刻を追加してみましょう。
この記事へのコメントはこちら