SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

プラグインで拡張できるJavaプログラムを作る

プラグイン方式によるプログラムの機能拡張

コンボボックスの処理

 コンボボックスは、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」として作成します。

AveragePLuginクラス
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用のマニフェストファイルを用意します。

AveragePluginのマニフェストファイル
Manifest-Version: 1.0
Plugin-Class: jp.tuyano.codezine.AveragePlugin

 ここでは、Plugin-Classにプラグインクラスを記述しておきます。こうして作成したら、プラグインクラスをコンパイルし、用意したマニフェストファイルを使ってJarファイル化しておきます。

 作成したJarファイルを「plugins」フォルダに入れて、アプリケーションを起動してみてください。追加したプラグインがコンボボックスに項目として表示されれば、プラグインを読み込んでいます。追加したプラグインを選ぶとコンボボックス下の表示が切り替わり、そこで数字を入力してボタンを押せば、平均がフィールドに書き出されます。入力のためのパネル部分と計算処理がプラグインのものに入れ替わっていることがよく分かるでしょう。

コンボボックスにプラグインが追加されている。これを選択するとGUIが変わり、クリックすると平均を計算するようになる。
コンボボックスにプラグインが追加されている。これを選択するとGUIが変わり、クリックすると平均を計算するようになる。

まとめ

 プラグイン方式によるプログラムの拡張は、「インターフェイスの設計」と、「どのような形でプラグインクラスを読み込ませるか」という設計部分の2つがポイントとなります。読み込み方法については、今回行ったものをベースにすればいろいろなやり方が考えられるようになるでしょう。実際に1~2度、簡単なプログラムを作ってみれば大体の流れは飲み込めるはずです。

 おそらく、最も難しいのは、インターフェイスの設計でしょう。これは、そのプラグインにどのような機能を持たせるか、どのような形でメインプログラムからアクセスするのが最もよいか、それによって大きく変わるからです。

 Javaは、Jarやマニフェストファイルなど、外部からプログラムを読み込むための仕組みが標準で備えられています。これらを使うことでプラグインの機能は比較的簡単に実装することができます。あなたのプログラムにも、一度プラグイン機能を追加してみてください。その後の機能追加などがずいぶんと楽になるはずですよ。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
特集記事連載記事一覧

もっと読む

この記事の著者

掌田 津耶乃(ショウダ ツヤノ)

三文ライター&三流プログラマ。主にビギナーに向けたプログラミング関連の執筆を中心に活動している。※現在、入門ドキュメントサイト「libro」、カード型学習サイト「CARD.tuyano.com」を公開...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1271 2007/05/15 08:00

おすすめ

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー