今からはじめるプログラミング21
ねたが。
まぁRPGをつくってすぐ別のプログラムを用意していたわけもなく。
初心に返って、Javaの勉強をした時のようではない「電卓」を作ってみようかな?と思って、こんな感じかな、とコーディングしてみたのですが。。。やはり計画、設計はできるならばするべきだな、と思い知りました。
とりあえずざっとコーディングしたものをこぴーしますね。
MainClass10
----------------------------------------------------
package sample10;
public class MainClass10 {
public static void main(String[] arguments) {
new CalculatorFrame();
}
}
----------------------------------------------------
まぁなんというかこれはこんなだろうと思いますかね?
つぎに表示する画面。
CalculatorFrame
----------------------------------------------------
package sample10;
import java.awt.Container;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
public class CalculatorFrame extends JFrame {
private JTextField field = null;
public void setText(String str) {
this.field.setText(str);
}
public String getText() {
return this.field.getText();
}
public CalculatorFrame() {
init();
}
private void init() {
Container container = this.getContentPane();
this.setBounds(10, 10, 300, 300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("でんたく");
this.field = new JTextField();
JButton btn1 = new JButton("1");
JButton btn2 = new JButton("2");
JButton btn3 = new JButton("3");
JButton btn4 = new JButton("4");
JButton btn5 = new JButton("5");
JButton btn6 = new JButton("6");
JButton btn7 = new JButton("7");
JButton btn8 = new JButton("8");
JButton btn9 = new JButton("9");
JButton btn0 = new JButton("0");
JButton btnC = new JButton("C");
JButton btnCE = new JButton("CE");
JButton btnAddition = new JButton("+");
JButton btnSubtraction = new JButton("-");
JButton btnMultiplication = new JButton("×");
JButton btnDivision = new JButton("/");
this.field.setBounds(10, 10, 130, 25);
btn1.setBounds(15, 35, 25, 25);
btn2.setBounds(45, 35, 25, 25);
btn3.setBounds(75, 35, 25, 25);
btn4.setBounds(15, 65, 25, 25);
btn5.setBounds(45, 65, 25, 25);
btn6.setBounds(75, 65, 25, 25);
btn7.setBounds(15, 95, 25, 25);
btn8.setBounds(45, 95, 25, 25);
btn9.setBounds(75, 95, 25, 25);
btn0.setBounds(15, 125, 25, 25);
btnC.setBounds(45, 125, 25, 25);
btnCE.setBounds(75, 125, 25, 25);
btnAddition.setBounds(105, 35, 25, 25);
btnSubtraction.setBounds(105, 65, 25, 25);
btnMultiplication.setBounds(105, 95, 25, 25);
btnDivision.setBounds(105, 125, 25, 25);
container.add(this.field);
container.add(btn1);
container.add(btn2);
container.add(btn3);
container.add(btn4);
container.add(btn5);
container.add(btn6);
container.add(btn7);
container.add(btn8);
container.add(btn9);
container.add(btn0);
container.add(btnC);
container.add(btnCE);
container.add(btnAddition);
container.add(btnSubtraction);
container.add(btnMultiplication);
container.add(btnDivision);
CalclatorListener listener = new CalclatorListener(this);
btn1.addActionListener(listener);
btn2.addActionListener(listener);
btn3.addActionListener(listener);
btn4.addActionListener(listener);
btn5.addActionListener(listener);
btn6.addActionListener(listener);
btn7.addActionListener(listener);
btn8.addActionListener(listener);
btn9.addActionListener(listener);
btn0.addActionListener(listener);
btnC.addActionListener(listener);
btnCE.addActionListener(listener);
btnAddition.addActionListener(listener);
btnSubtraction.addActionListener(listener);
btnMultiplication.addActionListener(listener);
btnDivision.addActionListener(listener);
btn1.setActionCommand("1");
btn2.setActionCommand("2");
btn3.setActionCommand("3");
btn4.setActionCommand("4");
btn5.setActionCommand("5");
btn6.setActionCommand("6");
btn7.setActionCommand("7");
btn8.setActionCommand("8");
btn9.setActionCommand("9");
btn0.setActionCommand("0");
btnC.setActionCommand("C");
btnCE.setActionCommand("CE");
btnAddition.setActionCommand("+");
btnSubtraction.setActionCommand("-");
btnMultiplication.setActionCommand("×");
btnDivision.setActionCommand("/");
this.setVisible(true);
}
}
----------------------------------------------------
電卓というのはボタンが多くて、それがめんどくさかったです。
そしてなんでパソコン関係は「×(かける)」を「*(アステリスク)」としたのでしょうか?そして「÷(わる)」は「/(スラッシュ)」だし。スラッシュはわかりやすいです?ね。perようするに分数です。(もしかすると違ってるかもしれないけれど。先生おしえてくさい。)
あとこのクラスはデータオブジェクトではないですが、こういう同じ記述の連続するクラスを作る際に、MicrosoftさんのExcelと秀丸エディターの「置換」を組み合わせて、数分でつくることができます。データクラスみたなものを作る時便利です。
違う部分(属性など)をExcelにリストとして入力して、前後のセルに同じ文字列をコピーして、入力したものを範囲選択してコピー、秀丸さんにペーストして不要なタブなどを削除。ソースにコピペする。そんなイメージなんですが、伝わらないかな?
そしてこの手のものはExcelのマクロとかVBAで自動でソースを出力するようにしてるプロジェクトとかもありますので、少し考えてみるのもいいと思います。
設計したものが実装になる、ある意味理想的な状態です。
次に、計算をするリスナーです。
CalclatorListener
----------------------------------------------------
package sample10;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class CalclatorListener implements ActionListener {
private String save = null;
private CalculatorFrame calculatorFrame = null;
public CalclatorListener(CalculatorFrame calculatorFrame) {
this.calculatorFrame = calculatorFrame;
save = "0";
}
@Override
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
System.out.println(command);
String saveValue = this.save;
String value = this.calculatorFrame.getText();
if("".equals(value)) {
value = "0";
}
if("".equals(saveValue)) {
saveValue = "0";
}
int iSave = Integer.parseInt(saveValue);
int iValue = Integer.parseInt(value);
if ("+".equals(command)) {
iSave = iSave + iValue;
this.calculatorFrame.setText(Integer.toString(iSave));
return;
}
if ("-".equals(command)) {
iSave = iSave - iValue;
this.calculatorFrame.setText(Integer.toString(iSave));
return;
}
if ("×".equals(command)) {
iSave = iSave * iValue;
this.calculatorFrame.setText(Integer.toString(iSave));
return;
}
if ("/".equals(command)) {
iSave = iSave / iValue;
this.calculatorFrame.setText(Integer.toString(iSave));
return;
}
if ("C".equals(command)) { this.save = "";
this.calculatorFrame.setText("");
return;
}
if ("CE".equals(command)) {
this.calculatorFrame.setText("");
return;
}
value += command;
this.save = value;
this.calculatorFrame.setText(value);
}
}
----------------------------------------------------
まだまだ冗長なプログラミングだなぁ、と思いつつ、実行してみました。
そもそも「/(わる)」のボタンがおかしなことになっていますね。。。
そして挙動もおかしいです。
今日はこんなとこですね。
結構すぐできるかと思ったのですが、意外と電卓って難しいですね。
そして自分が受けたセミナーの電卓は単純に2つの入力用フィールドを1つの出力フィールドに計算結果を表示するだけのものだったので、だいぶ違いますが、売ってる電卓に似せたいですので、何回かで作り込んでいきたいです。ボタンも足りないですね。
「/」ボタンがなぜこんな表示なのかもわからない。。。時々こういうイミフなバグに出会うと心が折れます。
そして今では電卓も進化しています。アマゾンのリンクです。