Preference で設定した値を使用する

値を利用するのは、値を設定するのと基本的には同じようです。

IPreferenceStore オブジェクトを取得して、そこから getString メソッドで home を取得するようにしました。

            IPreferenceStore store = WrpePlugin.getDefault().getPreferenceStore();
            String home = store.getString(WrpePlugin.LG3D_RREF_HOME_KEY);

CLASSPATH は今までの決めうちではなくて、定数に home を付加するようなコードを付け加えました。

これが定数

    private final static String INIT_CLASSPATH[] = {
            "/",
            "/lib/ext/lg3d-core.jar",
            "/ext/activation.jar",
            "/ext/escher-0.2.2.lg.jar",
            "/ext/j3d-contrib-utils.jar",
            "/ext/jaimlib.jar",
            "/ext/mail.jar",
            "/ext/nwn-0.7.jar",
            "/ext/odejava.jar",
            "/ext/satin-v2.3.jar"};

そして、処理は

            String classpath[] = new String[INIT_CLASSPATH.length];
            for (int i = 0; i < INIT_CLASSPATH.length; i++) {
                classpath[i] = home + INIT_CLASSPATH[i];
            }

同じように VM へのオプションも定数に home を埋め込んでいくような形です。こちらは java.util.Formatter を使ってみました。

定数が

    private final static String INIT_VMARGS = "-Xmx512m -Dj3d.sortShape3DBounds=\"true\""
                            + " -Dlg.configurl=file:///%1$s/etc/lg3d/lgconfig_1p_nox.xml"
                            + " -Dlg.displayconfigurl=file:///%1$s/etc/lg3d/displayconfig/j3d1x1"
                            + " -Dlg.etcdir=%1$s\\etc\\";

%1$s といのが書式を決めているところです。

これに対してここに home を埋め込んでいるのが

            Formatter formatter = new Formatter();
            formatter.format(INIT_VMARGS, home);
            String vmArgs = formatter.toString();

C の sprintf だと、埋め込む場所 (INIT_VMARGS だと 3 箇所) と同じ個数だけ、変数を列挙しなければいけないですよね。Java だと % の後に数字を書いて、その後に $ を書くと、その数字が埋め込む変数のインデックスになります。

したがって INIT_VMAGRS のようにすべて %1$s とすると、format メソッドでは 1 つの変数を書くだけで OK です。

ということで、Preference せインストール場所を変更しても、ちゃんと LG3D を起動させることができました。