時限タイマーを作ってみよう3

   2012/11/17

ある処理を実現するプログラムの書き方は何通りもあります。
実行速度を優先する、とか、メモリ消費が少ないようにする、あるいは
プログラムの行数を少なくする、など目的によって、あるいは好みに
よって書き方が変わります。

毎度、管理人イガジーです。

それでも、基本はだいたい同じなので、ひな形(テンプレート)的な
ソースコードを元に積み上げてゆくのが効率的です。

という訳で、時限タイマーのメッセージを出す部分を
作ってゆきましょう。

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();で、画面サイズを得ることができるので、そこから中央位置を
算出しています。

次回はこのメッセージボックスに、時刻を追加してみましょう。

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)