えー。
前回に引き続きまだ電卓ですw
今回で基本的な機能としては完成しました。
追加した機能としては+ - * / = の5つですが、
処理の仕方が意外とややこしく・・・
かなり時間をかけてしまいました。
具体的には・・・
たとえば、123と入力して - を押した後に 23 と入力します。
その後に = を押すと 100 と表示するようにしないと駄目ですよね?
1つの計算をするのに5つの要素が必要なんですね。
で、 - を押したということを認識するのは簡単ですが、つぎに = のボタンを押したことを認識したときに、前回 - を押しているから - の演算をしないといけないということも覚えておかないといけないわけです。
つまり、前回の処理と今回の処理を合わせて計算がされるわけですね。
その辺りがややこしく・・・
まだ精査してないそのままのコードですが、こうなりました。
package swingsam;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.prefs.BackingStoreException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Calctest extends JFrame implements ActionListener {
JPanel pane;
JTextField display;
String start = ""; // ここに空白を入れていると、nyuuryoku
// =Integer.parseInt(disp);でdispを読み取ったときに、 が入ってしまうとint型に変換できなくなってしまう。
String disp = start; // ディスプレイを初期化しておく(しておかないと、nullという文字が入ってしまう。
int nyuuryoku = 0; // 入力数字列
int nyuuryoku2 = 0; // 前回の入力数字列
int answer = 0; // 計算結果
String actioncommand = ""; // 今回の演算コマンド
String syoricommand = ""; // 前回の演算コマンド
int state = 0; // 電卓の状態
public Calctest(String s) {
super(s);
pane = new JPanel(new GridLayout(1, 1)); // 結果表示のためのパネル
display = new JTextField(); // 結果表示のためのテキストエリア
// フレームの構成
this.setSize(320, 240);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setLayout(new BorderLayout());
// ボタンなど、画面の構成
this.add(pane); // 結果表示のためのパネルをフレームに組み込む
pane.add(display);// 結果表示のためのテキストエリアをパネルにはめ込んで見えるようにする
display.setHorizontalAlignment(JTextField.RIGHT);// テキストエリアのカーソルを右側に出す
JPanel pane1 = new JPanel(new GridLayout(5, 4));// ボタン配置のためのパネル
String btnface[] = { "BS", "CL", "AC", "1", "2", "3", "+", "4", "5",
"6", "-", "7", "8", "9", "/", "0", "=", "+/-", "*" }; // ボタンの表示を作る
String actionCommand[] = { "BS", "CL", "AC", "1", "2", "3", "+", "4",
"5", "6", "-", "7", "8", "9", "/", "0", "=", "+/-", "*" };
JLabel dummy = new JLabel();// 無記入のラベルをひとつ作る
pane1.add(dummy);// pane1の1番始めのグリッドを空白にするためにひとつ付け足す
JButton btn;
for (int i = 0; i < btnface.length; i++) {
btn = new JButton(btnface[i]);
btn.addActionListener(this); // ActionListenerをbtn(作成したボタン)にadd(付け加えて)している。これでpublic
// void actionPerformed(ActionEvent
// e) が呼び出されるようになった!
btn.setActionCommand(actionCommand[i]); // actionCommandをセットして、ボタンの中身の判断が出来るようにする。(全部数字でそろえてifで判定できるようにする)
pane1.add(btn);
}
this.add(pane, BorderLayout.NORTH);
this.add(pane1, BorderLayout.CENTER);
pane.setBackground(new Color(00, 00, 00));
this.setVisible(true);
display("0");
}
public void display(String t) {
display.setText(t);
}
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();// まず、getActionCommandでボタンが押されたとき、そのボタンに設定されているActionCommand(set.ActionCommandで設定している。)をcmdに格納する。
if (cmd.equals("BS")) { // if文を使って何ボタンが押されたかを判定していきます。
if (disp.equals(""))
return;
int displength = disp.length();
// System.out.println("disp1"+disp);
disp = disp.substring(0, displength - 1);// substringメソッドを使うことで(先頭,終わり)の位置を指定して、文字の長さを変えることが出来る。
// displength-1では、displength(↑で宣言した、文字列の長さ)から一文字ずらしたものを表示するので、BSを押すと後ろが一文字消えたように表示できる。
// System.out.println("disp2"+disp);
display(disp);
return;
} else if (cmd.equals("CL")) {
disp = start;
display("0");
} else if (cmd.equals("AC")) { // ACが押されると全ての状態を初期化する
answer = 0;// 計算結果の初期化
disp = start;// 表示の初期化
nyuuryoku = 0; // 入力数字列
nyuuryoku2 = 0; // 前回の入力数字列
answer = 0; // 計算結果
actioncommand = ""; // 今回の演算コマンド
syoricommand = ""; // 前回の演算コマンド
state = 0; // 電卓の状態
display(String.valueOf(answer));
} else if (cmd.equals("1")) {
disp = disp + "1";
display(disp);
return; // 以下、数字が押されたらそこで戻る設定にする
} else if (cmd.equals("2")) {
disp = disp + "2";
display(disp);
return;
} else if (cmd.equals("3")) {
disp = disp + "3";
display(disp);
return;
} else if (cmd.equals("4")) {
disp = disp + "4";
display(disp);
return;
} else if (cmd.equals("5")) {
disp = disp + "5";
display(disp);
return;
} else if (cmd.equals("6")) {
disp = disp + "6";
display(disp);
return;
} else if (cmd.equals("7")) {
disp = disp + "7";
display(disp);
return;
} else if (cmd.equals("8")) {
disp = disp + "8";
display(disp);
return;
} else if (cmd.equals("9")) {
disp = disp + "9";
display(disp);
return;
} else if (cmd.equals("0")) {
disp = disp + "0";
display(disp);
return;
} else if (cmd.equals("+")) {
actioncommand = "+";
nyuuryoku = Integer.parseInt(disp);
disp = start;
} else if (cmd.equals("-")) {
actioncommand = "-";
nyuuryoku = Integer.parseInt(disp);
disp = start;
} else if (cmd.equals("+/-")) {
display("+/-");
disp = start;
} else if (cmd.equals("*")) {
actioncommand = "*";
nyuuryoku = Integer.parseInt(disp);
disp = start;
} else if (cmd.equals("/")) {
actioncommand = "/";
nyuuryoku = Integer.parseInt(disp);
disp = start;
} else if (cmd.equals("=")) {
actioncommand = "=";
nyuuryoku = Integer.parseInt(disp);
disp = start;
}
if (syoricommand.equals("+")) {
if(state==0)
answer=nyuuryoku2;
answer = answer + nyuuryoku;
disp = String.valueOf(answer);
display(disp);
disp = start;
state = 1;
} else if (syoricommand.equals("-")) {
if(state==0)
answer=nyuuryoku2;
answer = answer - nyuuryoku;
disp = String.valueOf(answer);
display(disp);
disp = start;
state = 1;
} else if (syoricommand.equals("+/-")) {
if(state==0)
answer=nyuuryoku2;
display("+/-");
state = 1;
} else if (syoricommand.equals("*")) {
if(state==0)
answer=nyuuryoku2;
answer = answer * nyuuryoku;
disp = String.valueOf(answer);
display(disp);
disp = start;
state = 1;
} else if (syoricommand.equals("/")) {
if(state==0)
answer=nyuuryoku2;
answer = answer / nyuuryoku;
disp = String.valueOf(answer);
display(disp);
disp = start;
state = 1;
} else if (syoricommand.equals("=")) {
if(state==0)
answer=nyuuryoku2;
display(String.valueOf(answer));
state = 1;
}
syoricommand = actioncommand;
nyuuryoku2 = nyuuryoku;
// TODO 自動生成されたメソッド・スタブ
}
public static void main(String[] args) {
Calctest frame = new Calctest("電卓");
}
}