先週に引き続き,今週もJava SE 6u10に含まれる次世代Java Plug-inがサポートするJNLP APIの紹介をしていきます。

先週は,サービスの取得方法とBasicServiceインタフェースの使い方について解説しました。今週はJNLP APIの中で最も頻繁に使用される,ローカルファイルにアクセスする方法について解説します。

ローカルファイルにアクセスするサービスは次に示す3種類です。

  • FileOpenService
  • FileSaveService
  • ExtendedService

FileOpenServiceとFileSaveServiceがファイルチューザを使用するサービス,ExtendedServiceがファイルチューザを使用せずに直接ファイル名を指定するサービスです。

FileOpenService

まずファイルチューザを使用してファイルをオープンするFileOpenServiceから紹介していきます。

サンプルのソース (こちらからダウンロードできます)
FileServiceSample.java
fileservicesample.jnlp

javax.jnlp.FileOpenServiceインタフェースで定義しているメソッドは以下の二つです。

  • openFileDialogメソッド
  • openMultiFileDialogメソッド

どちらもファイルチューザを使用してオープンするファイルを選択します。openFileDialogメソッドが単一のファイルをオープンするのに対し,openMultiFileDialogメソッドは複数のファイルをオープンできるという違いがあります。

これらのメソッドの戻り値の型はjavax.jnlp.FileContentsインタフェースです。JNLP APIでは,ファイルはすべてこのFileContentsインタフェースで扱います。FileContentsインタフェースはファイルが読み書き可能かどうか,ストリームの取得などの機能を持ちます。

ここではサンプルとして簡易的なテキストエディタを作ってみました。まず,テキストエディタの部分を解説してしまい,その後FileOpenServiceインタフェース,FileContentsインタフェースの使い方を見ていくことにします。

まず,テキストエディタの核となる部分を以下に示します。

public class FileServiceSample extends JApplet {
    private JTextArea textArea;
 
    @Override
    public void init() {
        // メニューバーの初期化
        initMenuBar();
 
        // まわりに余白を作る
        ((JComponent)getContentPane()).setBorder(
                         new EmptyBorder(10, 10, 10, 10));

        textArea = new JTextArea();
        JScrollPane pane = new JScrollPane(textArea);
        pane.setBorder(new EmptyBorder(10, 10, 10, 10));
        add(pane);
    }
 
    private void initMenuBar() {
        // メニューバーを生成
        JMenuBar menuBar = new JMenuBar();
        setJMenuBar(menuBar);
 
        // メニューバーにFile項目を追加
        JMenu menu = new JMenu("File");
        menuBar.add(menu);
 
        // FileメニューにOpen項目を追加
        JMenuItem openItem = new JMenuItem("Open...");
        menu.add(openItem);
 
        // FileメニューにSave項目を追加
        JMenuItem saveItem = new JMenuItem("Save");
        menu.add(saveItem);
    }
}

テキストエディタの本体は単にjavax.swing.JTextAreaクラスを使用しているだけです。必要に応じてスクロールバーを表示させるため,javax.swing.JScrollPaneクラスを使用しています。

initMenuBarメソッドではメニューバーの初期化を行います。メニューは[File]のみです。Fileメニューの項目として[Open...]と[Save]を設定しました。まだ,イベント処理は記述していないので,メニューが表示されるだけです。