java-beginner.com ブログ

プログラミングを学習するブログ(Javaをメインに)

Swingで簡易電卓を作成 1

投稿日:

最終更新日:2016年08月12日

アイキャッチ

こんにちは。「Javaを復習する初心者」です。

Swingで簡易電卓を作成しました。今回はその一部分である式の計算部分を説明します。

画面

Swingで簡易電卓を作成してたのですが、最新のソースはgithubに載せてあります。jarファイルもjava8が動く環境で実行できると思います。使っているPCにはjre1.8.0_102をインストールしてありますが、jarファイルをダブルクリックしたら起動できました。

https://github.com/java-beginner/simple-calculator-swing

画面は以下です。

swingcalc

式を入力して、「=」ボタンをクリックすると計算結果が表示されます。

計算結果を出すためのクラス

今回は式の計算結果を出すためのクラスを記載してあるEvaluation.javaのポイントを解説します。

先にソースの一部を貼ります。

Evaluation.javaの抜粋

    public Evaluation() {
        engine = new ScriptEngineManager().getEngineByName(Constants.SCRIPTENGINE_SHORT_NAME);
    }

    public String getValueOf(String formula) {

        String value = Constants.STR_EMPTY;
        try {
            engine.eval(String.format(Constants.SCRIPTENGINE_FORMAT_FOR_EVALUATION, formula));
            value = String.valueOf(engine.get(Constants.SCRIPTENGINE_VALUE));
        } catch (ScriptException e1) {
        }

        return value.equals(Constants.STR_NULL) ? Constants.STR_EMPTY : value;

    }

定数クラスConstantsに定義されている定数をいくつか使ってます。

変数名 内容
SCRIPTENGINE_SHORT_NAME “JavaScript”
STR_EMPTY “”
SCRIPTENGINE_FORMAT_FOR_EVALUATION “var value = eval(\”%s\”);”
SCRIPTENGINE_VALUE “value”
STR_NULL “null”

ScriptEngineManager().getEngineByName()メソッドの引数に”JavaScript”を指定します。このメソッドでScriptEngineが作成されます。詳しいことは分からないのですが、JavaScritpを動かすためのインスタンスということになります。eval(String script)メソッドが用意されていて、JavaScriptで書かれた文字列を引数に指定すると実行してくれます。

JavaScriptの内容ですが、例えば、式が「1 + 2」ならば「var value = eval(“1 + 2”);」が実行されます。String.formatメソッドによってそのような文字列になるように調節してます。JavaScriptにはevalメソッドが用意されていて、式を評価してくれます。JavaScriptの変数valueに結果が格納されます。その結果をJava側で取得するにはengine.getメソッドを使います。さらにString.valueOf(Object obj)メソッドでString型に変換してます。式が評価できなかった場合、”null”が格納されるようなので最後に三項演算子で分岐させてます。

演算のテスト

適当に演算をテストしたときのソースと結果です。演算子+, -, *, /, %と括弧を試しました。

ソース

package test;

import com.java_beginner.simple_calculator.Evaluation;

public class EvaluationTest {

    public static void main(String[] args) {

        Evaluation evaluation = new Evaluation();

        test(evaluation, "31 + 94");
        test(evaluation, "12 - 3");
        test(evaluation, "9 * 8");
        test(evaluation, "24 / 3");
        test(evaluation, "10 % 3");
        test(evaluation, "(1 + 2) * 5");

    }

    private static void test(Evaluation evaluation, String formula) {
        System.out.printf("%s = %s", formula, evaluation.getValueOf(formula));
        System.out.println();
    }
}

結果

31 + 94 = 125
12 - 3 = 9
9 * 8 = 72
24 / 3 = 8
10 % 3 = 1
(1 + 2) * 5 = 15

括弧の処理もうまくいってます。