1.Swing 〜コンテナの使いかた〜

AWT を拡張した Swing コンテナについて説明します。

(1) AWT の拡張

 中級編で AWT について紹介しました。ボタンやリストといった GUI のための部品をまとめて AWT というのでした。しかし、AWT のひととおりの部品は紹介しましたが、これだけではもの足りないと思いませんか?同じことを世界中の人も思っていました。そこで AWT を拡張した Swing と呼ばれるコンポーネント群が登場します。

 Swing はJDK1.1.X では別パッケージとなっていましたが、Java2(SDK1.2) からは標準の API に含まれるようになりました。ですから、JDK1.1.X を使って開発する場合は Swing のクラスをダウンロードして CLASSPATH を設定する必要があります。またブラウザを使って動かす場合は JavaPlug-in を使って、ブラウザの JVM を Java2 環境にする必要があります。それより、Java2(SDK1.2)以降をインストールしたほうが賢明です。

(2) Swing の特徴

 Swing にはいろいろなコンポーネントがあります。AWT にあったコンポーネントはもちろん、その他にエクスプローラーのようなツリー構造を表示する JTree、表として使える JTable、ワープロの作成やハイパーリンクの設定も可能な JEditorPane、テキストボックス+ドロップダウンリストの JComboBox・・・。

 デモプログラムをインストールした人は、SDKをインストールしてディレクトリに demo というディレクトリがあります。このなかに jfc というディレクトリがあるので README を読んで実行してみてください。

 Swing の部品はすべて Java で記述されています。AWT の部品はそのプラットフォームの GUI 部品を使っていますが、このようなコンポーネントは HeavyWeightComponent と呼ばれます。これに対して Swing のような Java で書かれたコンポーネントは LightWeightComponent(または軽量コンポーネント)と呼ばれます。Swing の部品はすべて Bean として作られているという特徴もあります。

 Swing コンポーネントは今までの AWT とほとんど同じようなプログラムの書き方で使うことができます。AWT と同じようなプログラムの書き方を場合は、Swing の機能を十分に使うことができません。Swing の機能を十分に利用するには、Swing 全体に共通する MVC モデル(ModelViewController Model)という考え方を覚える必要があります。これについては、すこし後で触れることにします。


(3) Swing のコンテナ

 ではそっさくいくつかの部品を紹介しましょう。ここでは、JFrame、JApplet の2つを紹介します。この2つのコンポーネントを見ると AWT コンポーネントの前にJをついた名前になっていることがわかります。Swing コンポーネントはこのようにJから始まる名前になっています。ですから、J をはずした AWT コンポーネントが想像できれば、使い方もだいたい分かるというわけです。

 では、まず JFrame について見てみます。JFrame は javax.swing パッケージのクラスです。これは Frame の Swing バージョンと思っていいでしょう。簡単なプログラム例を挙げます。

  JFrameSample.java

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

class JFrameSample {
    public static void main(String args[]) {
        JFrame f = new JFrame();
        f.setSize(200,200);
        Container c = f.getContentPane();
        c.setLayout(new FlowLayout());
        c.add(new JButton("OK"));
        f.setVisible(true);
    }
}


 実行例

C:\java_test>javac JFrameSample.java

C:\java_test>java JFrameSample


 実行結果



 JButton というコンポーネントは AWT の Button とほとんど同じものです。ここでポイントになるのは getContentPane( ) というメソッドです。Swing のコンテナでは、AWT のように直接コンテナに部品を追加できないものがあります。

 Swing のコンテナのうち、JFrame、JApplet、JWindow、JDialog ではこのように getContentPane( ) というメソッドをつかってコンポーネントを追加しなければいけません。これは、この4つのコンテナは多層構造をもつからです。

 コンテナの中にはいくつか名前のつけられたレイヤーがあり、実際に目に見える場合は、これらのレイヤーを重ね合わせた結果になります。glassPane は一番上のレイヤーなので、マウスのドラッグ時などの描画用に使われるレイヤーです。

 layeredPane は多層構造をもちます。これは1枚のレイヤーではありません。実際には JLayredPane クラスを利用して好きなだけレイヤーを作成できます。しかし、使いやすくするため、ある深さで名前がつけれられいます。たとえば、さきほどの例でも使用した、コンポーネントの張りつけ用のレイヤーの contentPane は深さが-30000のレイヤーです。

 少し難しいような気がしますが、覚えておくことは1つだけで、多層構造をもつコンテナを使う場合は、getContentPane( ) で contentPane を獲得してからコンポーネントの張り付けを行うということです。


(4) ブラウザで実行するために

 JApplet も同じように使える例を見ておきましょう。

  JAppletSample.java

import java.awt.*;
import javax.swing.JApplet;
import javax.swing.JButton;

public class JAppletSample extends JApplet {
    public void init() {
        setSize(200,100);
        Container c = getContentPane();
        c.setLayout(new FlowLayout());
        c.add(new JButton("OK"));
    }
}


  実行用 HTML ファイル

<APPLET CODE=JAppletSample.class width=200 height=100></APPLET>


  実行例

C:\java_test>javac JAppletSample.java

C:\java_test>appletviewer JAppletSample.html


  実行結果



 ここではアプレットビューアを使って実行してみました。このプログラムはほとんどのブラウザでは実行できません。

 インターネットエクスプローラやネットスケープナビゲータなど、おおくのブラウザではブラウザのJVMがJDK1.1.X にしか対応していません(ネットスケープ6では Java2 に対応しているようです)。このようなブラウザでは Swing コンポーネントがサポートされていないため、Swing コンポーネントを使ったプログラムは動きません。

 では、ブラウザをどうしたらJava2 環境にできるかというと、SDK1.2 以上をインストールするか、実行だけできれば良いのであれば、JRE1.2(JavaRuntimeEnvironment) 以上をインストールする必要があります。SDK をインストールした場合は自動的に JRE がインストールされます。

 これでブラウザが Java2 の JVM を利用する準備ができましたが、もう1つしておくことがあります。それはアプレットの実行のときには APPLET タグを書きますが、これを OBJECT タグ、または EMBED タグに置き換えるということです。しかし、この作業は非常に面倒なので、HTMLConverter というツールを使います。詳しくはこちらのページをみてください。


詳しくは JavaSoft のホームページの JavaPlug-in を見てください。

次の章( 2.Button系コンポーネント)