コンボボックスの処理
コンボボックスは、ArrayListをもとにプラグインを項目として追加しています。コンボボックスにコンポーネントなどを追加した場合、表示されるのはtoString()の値になりますので、toString()をプラグインクラスでオーバーライドすることでプラグイン名を表示させることができますね。
このコンボボックスを選択すると、使用するプラグインが切り替わるようになっています。ここでは、まず全コンポーネントを取り除き、それから改めてコンボボックスを組み込みなおしています。
panel.removeAll(); panel.add(pluginsCombo,BorderLayout.NORTH);
そして、選択されているプラグインを保管するselectedPluginと、そのGUI用パネルを保管するselectedPluginPanelにそれぞれインスタンスを設定します。
selectedPlugin = (SamplePluginAppPlugin)
pluginsCombo.getSelectedItem();
selectedPluginPanel = selectedPlugin.getPanel();
後は、selectedPluginPanelを改めてaddし、表示を更新するだけです。既にプラグインのインスタンスがひとまとめに用意されていれば、このように使用プラグインの設定などは比較的簡単に行えるでしょう。
プラグインクラスを追加する
では、サンプルで用意したプラグインクラスはどうなっているでしょうか。implementsしてあるSamplePluginAppPluginのメソッドを一通り実装していることが分かりますね。そのうち、getInputData/setInputDataは、単純にprivateフィールドと値をやり取りしているだけです。
toString()は、プラグイン名を返すようにしてあります。また肝心のgetResult()では、データを保管してあるprivateフィールドのStringを元に、計算を行い、その結果を返しています。プラグインの処理そのものは、それほど難しいものではないことが分かるでしょう。
では、同様にしてプラグインのファイルを作成してみることにしましょう。ここでは、入力した数値の平均を計算するプラグインを作成してみましょう。まずはソースコードからです。ここでは「AveragePlugin.java」として作成します。
package jp.tuyano.codezine; import java.awt.Rectangle; import javax.swing.*; public class AveragePlugin implements SamplePluginAppPlugin { private JTextArea input = null; public String toString(){ return "Average"; } public String getResult() { String inputData = input.getText(); if (inputData == null) inputData = "0"; String[] arr = inputData.split("\n"); int[] intarr = new int[arr.length]; for (int i = 0; i < arr.length; i++) { try { intarr[i] = Integer.parseInt(arr[i]); } catch (NumberFormatException e) { e.printStackTrace(); } } int total = 0; for (int i : intarr) { total += i; } double av = total / intarr.length; double res = ((int)(av * 100)) / 100; return Double.toString(res); } public String getInputData() { return input.getText(); } public void setInputData(String str) { input.setText(str); } public JPanel getPanel() { JPanel p = new JPanel(); p.setLayout(null); input = new JTextArea(); input.setLineWrap(true); JScrollPane s = new JScrollPane(input); s.setBounds(new Rectangle(25,25,75,50)); p.add(s); return p; } }
このプラグインでは、GUIのパネルにJTextAreaを配置し、改行して記述された1つ1つの値を合計し、平均を計算するように設計してみました。続いて、Jar用のマニフェストファイルを用意します。
Manifest-Version: 1.0 Plugin-Class: jp.tuyano.codezine.AveragePlugin
ここでは、Plugin-Classにプラグインクラスを記述しておきます。こうして作成したら、プラグインクラスをコンパイルし、用意したマニフェストファイルを使ってJarファイル化しておきます。
作成したJarファイルを「plugins」フォルダに入れて、アプリケーションを起動してみてください。追加したプラグインがコンボボックスに項目として表示されれば、プラグインを読み込んでいます。追加したプラグインを選ぶとコンボボックス下の表示が切り替わり、そこで数字を入力してボタンを押せば、平均がフィールドに書き出されます。入力のためのパネル部分と計算処理がプラグインのものに入れ替わっていることがよく分かるでしょう。

まとめ
プラグイン方式によるプログラムの拡張は、「インターフェイスの設計」と、「どのような形でプラグインクラスを読み込ませるか」という設計部分の2つがポイントとなります。読み込み方法については、今回行ったものをベースにすればいろいろなやり方が考えられるようになるでしょう。実際に1~2度、簡単なプログラムを作ってみれば大体の流れは飲み込めるはずです。
おそらく、最も難しいのは、インターフェイスの設計でしょう。これは、そのプラグインにどのような機能を持たせるか、どのような形でメインプログラムからアクセスするのが最もよいか、それによって大きく変わるからです。
Javaは、Jarやマニフェストファイルなど、外部からプログラムを読み込むための仕組みが標準で備えられています。これらを使うことでプラグインの機能は比較的簡単に実装することができます。あなたのプログラムにも、一度プラグイン機能を追加してみてください。その後の機能追加などがずいぶんと楽になるはずですよ。
