こんにちは。ハンドルネーム「Javaを復習する初心者」です。このサイトはプログラミング言語Javaの復習・学習をするブログです。プログラムの開発・実行はEclipseで行ってます。
スポンサーリンク
お知らせ
  • 参考文献のページ作りました。
  • Amazon.co.jpアソシエイトに参加していますが、参考文献の紹介はもしもアフィリエイトに統一しました。
  • 2016年10月9日からは投稿ペースを落とします。週1回くらいにする予定です。
スポンサーリンク

Swingで簡易電卓を作成 3

こんにちは。「Javaを復習する初心者」です。Swingで簡易電卓を作成しました。そのプログラムの説明の3回目です。今回で「Swing簡易電卓」の説明は終わりにします。今回はボタンをクリックしたときの動作についてです。

GitHubのリポジトリは以下です。

simple-calculator-swing - Java Swingによる簡易電卓

画面は以下です。

swingcalc

ボタンの動作

ボタンをクリックしたときの動作は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載せてまして、そこでコメントにて教えてくださった方がいらっしゃいました。

JavaFXでFXMLと呼ばれるXMLファイルにJavaScriptを記述することができます。JavaScriptのeval()関数という式を評価する関数を使って、簡易電卓を作成しました。 #画面 以下の画面です。 ![calc...

チェックがないと任意のコードが実行可能になってしまうこと、例えば「java.lang.System.exit(0)」で終了してしまうことを教えてもらいました。