応用アプリケーション:テキストファイルビューア

最後に、少し実用的なアプリケーションを紹介する。長いので、詳しく説明 するつもりはない。安心してほしい。

import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/* 超簡易テキストファイルビューア */
public class TextView {
  private JFrame frame;
  private JTextArea textArea;

  /* コンストラクタ */
  public TextView() {
    frame = new JFrame("TextView");
    frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
    frame.addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent ev) {
        frame.dispose();
        System.exit(0);
      }
    });
    frame.setJMenuBar(createMenuBar());
    frame.getContentPane().add(createTextArea());
    frame.pack();
    frame.show();
  }

  /* メニューバーを作って返す */
  private JMenuBar createMenuBar() {
    JMenuBar mb = new JMenuBar();
    JMenu m = new JMenu("File");
    JMenuItem mi = new JMenuItem("Open...");
    mi.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent ev) {
        openFile();
      }
    });
    m.add(mi);
    m.addSeparator();
    mi = new JMenuItem("Quit");
    mi.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent ev) {
        frame.dispose();
        System.exit(0);
      }
    });
    m.add(mi);
    mb.add(m);

    return mb;
  }

  /* テキストエリアを作って返す */
  private JComponent createTextArea() {
    textArea = new JTextArea(30, 80);
    textArea.setEditable(false);
    textArea.setLineWrap(true);
    textArea.setFont(new Font("Monospaced", Font.PLAIN, 14));

    JScrollPane scrollPane = new JScrollPane();
    JViewport viewport = scrollPane.getViewport();
    viewport.add(textArea);

    return scrollPane;
  }

  /* 指定されたファイル名のファイルを閲覧する */
  public void viewFile(String fname) {
    try {
      Reader in = new BufferedReader(new FileReader(new File(fname)));
      textArea.read(in, null);
      in.close();
      frame.setTitle("TextView - " + fname);
    } catch (IOException ioe) {
      JOptionPane.showMessageDialog(frame, ioe, "Error",
                                    JOptionPane.ERROR_MESSAGE);
    }
  }

  /* ダイアログを表示して、閲覧するファイル名を訊ねる */
  public void openFile() {
    JFileChooser chooser = new JFileChooser();
    if (chooser.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION) {
      viewFile(chooser.getSelectedFile().getPath());
    }
  }

  /* メイン */
  public static void main(String[] arg) {
    if (arg.length == 0) {
      (new TextView()).openFile();
    } else if (arg.length == 1) {
      (new TextView()).viewFile(arg[0]);
    } else {
      System.out.println("usage: java TextView [filename]");
    }
  }
}

ファイルは TextView.java

実行

コンパイルしてから、

% java TextView TextView.java

などとして実行すると、引数に指定したファイルの内容を見れる。

スクリーンショット:
[Screen shot of TextView application]

コードの解説

このアプリケーションでは、Swing という、ユーザーインターフェースを構 築するための Java のライブラリ(JDK 1.2 から標準のライブラリに入っている) を使っている。ここではアプリケーションのフレームや、テキストを表示する領 域、エラーの発生を伝えるダイアログ、またファイルを開くためのダイアログに Swing を使っている。それぞれの部品がクラスとして提供されているので、それ を組み合わせていけばユーザーインターフェースが構築できる。

基本的に、GUI を使ったアプリケーションは、起動されると、まず部品を組 み合わせてユーザーインターフェースを構築し、あとはユーザーからの操作(イ ベント)を待つという形になる。このプログラムでは TextView クラスのコンストラクタ(と、そこから呼ばれる createMenuBar(), createTextArea())でひととお りのユーザーインターフェースの構築を行なっている。Java では、イベントの 処理は、各部品に登録しておく、という形をとる。ソース中で addXXXXXLitener というメソッドの呼び出しが、その 登録処理である。その addXXXXXLitener の引数には、 部分的なクラス定義のようなものが与えられているが、これは内部クラスといっ て、実際、クラス定義である。詳しくは書かないが、イベントの処理にも一人前 のクラスの地位を与えているのである。