最後に、少し実用的なアプリケーションを紹介する。長いので、詳しく説明 するつもりはない。安心してほしい。
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
などとして実行すると、引数に指定したファイルの内容を見れる。
スクリーンショット:
このアプリケーションでは、Swing という、ユーザーインターフェースを構 築するための Java のライブラリ(JDK 1.2 から標準のライブラリに入っている) を使っている。ここではアプリケーションのフレームや、テキストを表示する領 域、エラーの発生を伝えるダイアログ、またファイルを開くためのダイアログに Swing を使っている。それぞれの部品がクラスとして提供されているので、それ を組み合わせていけばユーザーインターフェースが構築できる。
基本的に、GUI を使ったアプリケーションは、起動されると、まず部品を組
み合わせてユーザーインターフェースを構築し、あとはユーザーからの操作(イ
ベント)を待つという形になる。このプログラムでは TextView
クラスのコンストラクタ(と、そこから呼ばれる
createMenuBar()
, createTextArea()
)でひととお
りのユーザーインターフェースの構築を行なっている。Java では、イベントの
処理は、各部品に登録しておく、という形をとる。ソース中で
addXXXXXLitener
というメソッドの呼び出しが、その
登録処理である。その addXXXXXLitener
の引数には、
部分的なクラス定義のようなものが与えられているが、これは内部クラスといっ
て、実際、クラス定義である。詳しくは書かないが、イベントの処理にも一人前
のクラスの地位を与えているのである。