16進電卓を作ってみよう2

   2012/05/08

コンピュータが得意な作業は「繰り返し」です。ですから、プログラミングにおいても
できるだけ繰り返し(ループ)を作るようにすると効率的です。

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

昨日の続きで、まずは電卓の画面を生成するプログラムです。
電卓のキー(ボタン)を、Panelにaddするのをベタに書き下すと
次のような感じになります。(GridLayoutは、左から右、
上から下にむかって格納されます)

	Button btn[]=new Button[20];
	Panel keys=new Panel();
	keys.setLayout(new GridLayout(5,4));
	btn[0]=new Button("A"); keys.add(btn[0]);
	btn[1]=new Button("B"); keys.add(btn[1]);
	btn[2]=new Button("C"); keys.add(btn[2]);
	...

これを、冒頭に書いたように繰り返し(ループ)処理にします。
違いはボタンのラベルだけですから、表示用の文字を配列にすれば良いですね。

	Button btn[]=new Button[20];
	Panel keys=new Panel();
	keys.setLayout(new GridLayout(5,4));
	String lb[]={
		"A","B","C","D",
		"7","8","9","E",
		"4","5","6","F",
		"1","2","3","CLR",
		"0","+","-","="
	};
	for (int i=0;i<20;++i) {
		btn[i]=new Button(lb[i]);
		keys.add(btn[i]);
	}

●dec ○HEX のラジオボタンは、Panel prd を FlowLayoutにして格納します。
FlowLayoutは無指定だと中央寄せになるので、prd.setLayout(new FlowLayout(FlowLayout.LEFT));として、左詰めにします。

文字を大きくするには、フォントを指定します。

fbig=new Font("Monospaced",Font.PLAIN,36);
fmid=new Font("Monospaced",Font.PLAIN,24);

と2種類用意して結果表示用ラベルには、fbigを、キー(ボタン)には、fmidをセットしましょう。

全コードは次のようになります。

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Panel;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class Dentaku1 {
	Frame f0;
	Label dsp;
	Font fbig,fmid;
	Button btn[]=new Button[20];
	Checkbox hx,dc;
	CheckboxGroup cbg;

	String lb[]={
		"A","B","C","D",
		"7","8","9","E",
		"4","5","6","F",
		"1","2","3","CLR",
		"0","+","-","="
	};

	Dentaku1(){
		f0=new Frame();
		f0.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent ev) {
                System.exit(0);
            }
        });
		f0.setTitle("decHEX1");
		fbig=new Font("Monospaced",Font.PLAIN,36);
		fmid=new Font("Monospaced",Font.PLAIN,24);

		dsp=new Label("0");
		dsp.setAlignment(Label.RIGHT);
		dsp.setFont(fbig);
		dsp.setBackground(Color.LIGHT_GRAY);

		Panel p1=new Panel();
		p1.setLayout(new BorderLayout());

		cbg=new CheckboxGroup();
		dc=new Checkbox("dec",true,cbg);
		hx=new Checkbox("HEX",false,cbg);
		Panel prd=new Panel();
		prd.setLayout(new FlowLayout(FlowLayout.LEFT));
		prd.add(dc); prd.add(hx);
		p1.add(prd,BorderLayout.SOUTH);
		p1.add(dsp,BorderLayout.CENTER);

		Panel keys=new Panel();
		keys.setLayout(new GridLayout(5,4));
		for (int i=0;i<20;++i) {
			btn[i]=new Button(lb[i]);
			btn[i].setFont(fmid);
			keys.add(btn[i]);
		}

		f0.add(p1,BorderLayout.NORTH);
		f0.add(keys,BorderLayout.CENTER);
		f0.setSize(300,300);
		f0.setVisible(true);
	}
	public static void main(String[] args) {
		new Dentaku1();
	}
}

今日のところは見た目だけで、処理は入っていません。いわばハリボテです。

これに処理を入れてゆくのですが、数字キー用に専用のボタンを作ってみます。

	int result=0;
	class nBtn extends Button implements ActionListener {
		private static final long serialVersionUID = 1L;
		int nn;
		nBtn(String lb,int v){
			super(lb);
			nn=v;
			this.addActionListener(this);
		}
		@Override
		public void actionPerformed(ActionEvent e) {
			result=result*10+nn;
			dsp.setText(Integer.toString(result));
		}
	}

元からあるButtonをextendsしてnBtnという自前のクラスにしています。
これを「継承」と呼びます。
上記の例の nBtn は、押された(クリックされた)時に、
resultを10倍してキー自身の値(nn)を加え、Label dspにセットする処理を
内蔵したボタンなのです。

明日はこれの改良版をハリボテに追加してみることにします。

16進電卓を作ってみよう1
16進電卓を作ってみよう2(this)
16進電卓を作ってみよう3
16進電卓を作ってみよう4
16進電卓を作ってみよう5
16進電卓を作ってみよう6
16進電卓を作ってみよう7
16進電卓を作ってみよう8
16進電卓を作ってみよう9

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

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

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

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