前のページ
()の
作成で、+−*/=の演算ボタンのイベント処理を追加ました。
演算キーを押した時に、前に押した演算キーによる演算結果を上のラベルに表示する方法でした。
しかしここでは、操作を間違と次のような実行エラーが生じます。
Exception in thread "AWT-EventQueue-0"
java.lang.NumberFormatException: For input String: ??
at sun.misc.FloatingDecimal.readJavaFormatString(省略)
・・・省略・・・
演算キーで下部のテキストフィールドと上部ラベルを演算しているのですが、
操作を間違えると、空白などのテキストフィールドで演算され、
数字以外の入力と判断されるためです。
(また、ドットが複数入力した場合も同様の実行エラーになります)
そこで、この文字列から数値変換において起きるNumberFormatException例外をキャッチして
次のダイアログを表示させます。そして、この表示の時のキー操作ーは無視することとします。
これは次のコードで表示されます。
JOptionPane.showMessageDialog(this, "数字入力に問題があります。\n変更ください。");
thisで指定するのは、フレームやパネルオブジェクトです。
(JOptionPaneはjavax.swingのパッケージにあります)
なお、演算で四則演算( + - / * )のキーのいずれかを連続して
入力する操作ミスに対して、後で入力した方のキーを有効にします。
そして、= のキーを連続して入力した場合はラベルの表示もゼロにします。
以下は、この動作ができるようにNomalCalcPanelを変更したプログラム例です。
『演算キー直後の時だけtrue』となる変数opFlagを用意して、
それがtrueの時で、下のテキストフィールドが空でない時に
演算キーをクリックしたら、演算キーが変更されたことを示すダイアログも表示させています。
public class NomalCalcPanel extends SimpleCalcPanel implements ActionListener{ boolean opFlag = false; // 演算キー直後の時だけtrueにする。 ・・・省略・・ public void actionPerformed2(ActionEvent e){ if (e.getSource() instanceof JButton == false) return; super.actionPerformed(e); JButton btn = (JButton)e.getSource(); String str = btn.getText(); if (str.equals("+") || str.equals("-") || str.equals("*") || str.equals("/") || str.equals("=")) { if (backOp == '=') { if(str.equals("=")){ this.lbl1.setText("0");//2回連続して=の場合はクリア this.txt1.setText(""); this.backOp = '='; return; } if (this.txt1.getText().equals("")) { this.backOp = str.charAt(0); return; } try { double d2 = Double.parseDouble(this.txt1.getText()); this.lbl1.setText(this.txt1.getText()); } catch (NumberFormatException err1) { JOptionPane.showMessageDialog(this, "数字入力に問題があります。\n変更ください。"); return; } } else { if (this.opFlag) { if (this.backOp == str.charAt(0)) return; JOptionPane.showMessageDialog(this, "以前の『"+backOp+"』キーーを無効にし、 \n『" + str + "』このキーを有効にします。"); this.backOp = str.charAt(0); return; } double d1 = 0; double d2 = 0; try { d1 = Double.parseDouble(this.lbl1.getText()); d2 = Double.parseDouble(this.txt1.getText()); } catch(NumberFormatException err1) { JOptionPane.showMessageDialog(this, "数字入力に問題があります。\n変更ください。"); return; } if (backOp == '+') { this.lbl1.setText("" + (d1 + d2)); } else if (backOp == '-') { this.lbl1.setText("" + (d1 - d2)); } else if (backOp == '*') { this.lbl1.setText("" + (d1 * d2)); } else if (backOp == '/') { this.lbl1.setText("" + (d1 / d2)); } } this.txt1.setText(""); this.backOp = str.charAt(0); this.opFlag = true; }else{ this.opFlag = false; } } ・・・省略・・ }