Mathematica 9 is now available

MathematicaJ/Link グラフィカルユーザインターフェースを作成するには,どうすればよいのですか.

以下の基本的な例では,Mathematica ノートブック内でJ/Link グラフィカルユーザインターフェース(GUI)を作成する方法を示します.まず,簡単な例から始めて,追加の機能を導入・説明しながら難しいものへと進めていきます.以下の例では,各GUIの作成方法をステップごとに説明しています.


簡単な例:「Hello World!」

ここでは,以下を作成します.

この例のMathematica コードです.

Get["JLink`"]
InstallJava[];
frm = JavaNew["com.wolfram.jlink.MathJFrame"];
panel = JavaNew["javax.swing.JPanel"];
label = JavaNew["javax.swing.JLabel", "Hello World!"];
panel@add[label];
frm@getContentPane[]@add[panel];
frm@setSize[50, 50];
JavaShow[frm];

これはJ/Link の例題で最も簡単なもののひとつです.単純ですが,以下のようなほとんどのJ/Link プログラムの基礎となっているコードが含まれています.

1. JLink のロードの方法

2. Java Runtime Environmentの起動方法

3. フレームの作成方法

4. フレームに何かを加える方法

5. フレームの表示方法


インターフェースに簡単な動作を加える

次はSimpleModal[]です.これも簡単な例で,ユーザがボタン(JButton)をクリックするたびにテキストフィールド(JTextField)が更新されます.

以下は,ボタンを初期化するコードです.

button = JavaNew["javax.swing.JButton", "Increment by one"];
buttonListener = JavaNew["com.wolfram.jlink.MathActionListener"];
buttonListener@setHandler["actionPerformed", "buttonFunc"];
button@addActionListener[buttonListener];

1行目でボタンを生成します.2行目でbuttonListenerMathActionListenerオブジェクトに設定します.3行目でbuttonListenerが呼び出されらMathematica 関数のbuttonFunc[]が呼び出されるように設定します.4行目でボタンクリック用のイベントハンドラを登録します.

以下のコードは,テキストフィールドを初期化・操作するためのものです.

textField = JavaNew["javax.swing.JTextField", "1", 10];

buttonFunc[_, _] :=
JavaBlock[Module[{curText, newVal}, curText = textField@getText[];
newVal = ToExpression[curText] + 1;
textField@setText[ToString[newVal]]]];

上記の例題でボタンの設定方法が分かったら,この例題と類似したチェックボックスやラジオボタンの設定方法も分かります.


簡単なPlotインターフェースの作成

MathematicaPlotApplet[]に出力をプロットする方法を見てみましょう.まず,関数を入力します.Plotボタンをクリックするたびにプロットが更新されます.

この例では,テキストフィールドから入力を抽出し,Mathematica コマンドでラップして,それをMathCanvasオブジェクトに送ります.

以下のようにしてMathCanvasオブジェクトをMathematica にロードします.

mathCanvas = JavaNew["com.wolfram.jlink.MathCanvas"];

次に,ボタンリスナに付属する適切なボタンを作成します.ボタンは呼び出されたら,buttonFunc関数を実行します.

plotButton = JavaNew["javax.swing.JButton", "Plot"];
buttonListener = JavaNew["com.wolfram.jlink.MathActionListener"];
buttonListener@setHandler["actionPerformed", "buttonFunc"];
plotButton@addActionListener[buttonListener];

以下の関数がボタンで呼び出される関数です.この関数はテキストフィールドから入力を抽出して,それを評価のためにMathCanvasに送ります.これはsetMathCommandメソッドで実行されます.ここでは,プロットするために入力をMathematica コマンドのPlotでラップしてあります.

buttonFunc[_, _] :=
JavaBlock[
Module[{plotFunction}, plotFunction = functionField@getText[];
mathCanvas@setMathCommand["Plot[" <> plotFunction <> ", {x, 0, 10},
Background -> GrayLevel[.80]]"]]];


PlotインターフェースにAdjustmentListenerを加える

ここでは,PlotAppletwithAdjustment[]でアクションリスナを上記のPlotの例に加える方法を見てみます.関数を入力し,スライダバーを調整し,Plotボタンをクリックすると,プロットが更新されます.

この例では,テキストフィールドとスライダバーから入力を抽出し,それをMathematica コマンドでラップし,MathCanvasオブジェクトに送ります.

以下のコードで,適切なリスナであるMathAdjustmentListenerに付属する適切なスクロールバーを生成します.スクロールバーの変化で, scrollbarFunc関数が実行されます.この関数は,plotDomainTextJLabelを更新するだけです.

plotDomainText = JavaNew["javax.swing.JLabel", "10"];

scrollbar = JavaNew["javax.swing.JScrollBar", 0, 10, 1, 10, 50];

scrolllistener = JavaNew["com.wolfram.jlink.MathAdjustmentListener"];
scrolllistener@setHandler["adjustmentValueChanged", "scrollbarFunc"];
scrollbar@addAdjustmentListener[scrolllistener];

scrollbarFunc[_, _, scrollPos_] :=
JavaBlock[Module[{}, plotDomainText@setText[ToString[scrollPos]]]];

Plotボタンのクリックで,buttonFunc関数が実行されます.この関数はテキストフィールドから入力を,plotDomainTextからテキストを抽出し,評価のためにMathCanvasに送ります.

buttonFunc[_, _] :=
JavaBlock[
Module[{plotFunction, plotDomain},
plotFunction = functionField@getText[];
plotDomain = plotDomainText@getText[];
mathCanvas@
setMathCommand[
"Plot[" <> plotFunction <> ",{x, 0, " <> plotDomain <> "},
Background -> GrayLevel[.8], PlotStyle -> RGBColor[0, 0, 1]]"]]];


ファイルシステムのファイルとの対応

ここでは,ファイルシステムとのリンクについて見てみましょう.ファイルを選んだときにそのファイルの場所をMathematica のフロントエンドに送り返すインターフェースを作成します.

ファイルセレクタの例はMathematica コードをご覧ください.