実践:MVCモデル(3)
By S.Nagao
本記事では、プログラミング開発において有用なフレームワークであるMVC(Model-View-Controller)モデルを、 VTK-wrap-Javaプログラミングを通じて理解します。
第三回は、
実践:MVCモデル(1)
実践:MVCモデル(2)
に続いて、Controllerを理解します。
Controller - オペレータからの要求を処理
Prog-Aにおいて、表示されるメッシュをオペレータが選択する必要があります。
読み込みボタンの押下によって、入力ファイルの選択ダイアログを表示して、 ファイルを選択させ、プログラムに設定します。
まず、ドキュメントクラスのReadMeshクラス内のfilename変数に代入します。
vtkWindowに表示するために、
メッシュを表示するためのパイプラインを作成して、Actorを
vtkRendererに追加します。
画面を表示するために、ViewクラスのvtkPanelクラスのrepaintメソッドを呼び出します。
Controllerクラスは、オペレータからの要求を受け付けるために、パネル上にボタンやテキストボックス等の 入力クラスを配置する必要があります。
同じ配置のパネルは継承して作成します。継承後、入力メソッドをオーバーライドして、違う機能を実装します。
Controllerクラスの親クラスには、Modelクラスへの参照変数を定義する必要があります。
MeshDataクラスへの参照です。
同じく、Viewクラスへの参照が必要です。
MeshData.setFileName()や、MeshData.pipelineCreate()等のメソッドを呼び出します。
repaintメソッドを呼び出すときには、注意が必要です。
vtkPanelクラスへの参照を親クラスで定義して、直接呼び出すやり方もありますが、
EDT(イベントディスパッチスレッド)になっていることを確認してください。
以下のようにします。
Runnable repaint = new Runnable() {
public void run() {
getRenWin().repaint();
};
};
javax.swing.SwingUtilities.invokeLater(repaint);
SwingUtilitiesクラスを使用すると、EDTスレッド内で実行されます。
アニメーションなどを行う時は、特に注意が必要です。
また、上記の実行を、EDTフレームに定義して、Controllerクラスからは 以下のように実行することができます。
Component parent = SwingUtilities.getRoot(this);
if(parent == null) return;
parent.repaint();
Controllerクラス(入力パネル)の親、普通、EDTフレームクラスになっていますが、
その親を参照して、EDTフレームのrepaintメソッドを実行します。
EDTフレームでは、repaintメソッドをオーバーライドして、
super.repaint()を実行し、vtkPanelのrepaintを実行します。
Viewクラスのrepaintを、EDTフレームの親クラスに集約して、実行するほうが安全です。
Controllerクラス群は以下のようになります。
mainFrame extends java.swing.Jframe
protected documentClass;
protected vtkCanvas;
protected fileInputPanel;
public override repaint();
fileInputPanel extends java.swing.JPanel
protected inputButton;
public fileinput();
fileInputメソッドでは、ファイルダイアログを開いてメッシュファイル名を入力し、
documentClassに設定し、表示用のパイプラインを作成します。
ドキュメントクラスのActorをViewクラスのレンダラーに設定し
Viewクラスのrepaint()メソッドを実行します。
vtkCanvas及び、fileInputPanelはフレーム(画像)上に配置する必要があります。
メニューや操作パネルなどをControllerクラスは含みます。
今回は、ここまで。 実践:MVCモデル(4)です。