こんにちは。「Javaを復習する初心者」です。
Swingで簡易電卓を作成しました。そのプログラムの説明の3回目です。今回で「Swing簡易電卓」の説明は終わりにします。今回はボタンをクリックしたときの動作についてです。
GitHubのリポジトリは以下です。
https://github.com/java-beginner/simple-calculator-swing
画面は以下です。
ボタンの動作
ボタンをクリックしたときの動作はActionHandler.javaで定義してます。(このクラス名が適切かどうかはわかりません。)
ボタンを押したときの動作を設定するには[ JButtonのインスタンス ].addActionListener([ ActionListenerの実装クラスのインスタンス ])という書き方をします。今回はActionHandlerクラスがActionListenerの実装クラスです。コンストラクタでPanelOfButtonsを受け取ってPanelOfButtonsのJButtonそれぞれに対して、リスナーにActionHandler自身を追加するようにしました。
ActionHandlerクラスはActionListenerを実装するためactionPerformedをオーバーライドしています。引数はActionEventでgetActionCommand()メソッドでアクションに関連付けられたアクションコマンドを取得することができます。これはJButtonを生成した箇所でsetActionCommand()メソッドで指定した文字列です。押されたボタンが何なのかをこれでチェックしていきます。今回はボタンのラベルとアクションコマンドを一致させているため、ラベルと比較しています。出力対象のラベルの場合、文字列を式に追加していますが、JTextFieldクラスにはgetCaretPosition()が用意されていて、カーソルの位置が取得できます。そこで式の途中に文字を挿入するということが可能です。
アクションコマンドが「=」である場合、計算をすることになるのですが、その前に入力チェックをしています。空文字チェックと入力チェックです。入力チェックでは正規表現を使って、式に余計な文字列が入っている場合にエラー扱いにします。今回は式の入力にJTextFieldクラスを使っていて、任意の文字列が入力できるからです。全てのチェックを通過した場合、Evaluationクラスへ式を渡して、結果を受け取ります。受け取った結果を値表示用のJTextFieldに設定しています。
入力チェック
入力チェックについてですが、最初はこのようなチェックについては考慮してませんでした。この記事に先行して、「JavaFXとJavaScriptを使った簡易電卓」という記事をQiita載せてまして、そこでコメントにて教えてくださった方がいらっしゃいました。
http://qiita.com/java-beginner/items/ce013c5b7fe8e69be082
チェックがないと任意のコードが実行可能になってしまうこと、例えば「java.lang.System.exit(0)」で終了してしまうことを教えてもらいました。