7-7: ウィンドウアプリケーションの例

Swingコンポーネントのイベント処理を利用したアプリケーションの例を紹介します。

・ まず、アプリケーションの外観と各クラスの役割を見てみましょう。 アプリケーションのクラス名は PaintTool です。実行すると下図のようになります。 PaintTool自身は JFrameのサブクラスです。 内部に絵を描くためのキャンバスの部分(PaintCanvas)と 色や線の形状を操作するためのパネルの部分(ControlPanel)を表示します。
参照:PaintTool のソース PaintTool.java

PaintToolの本体

・ PaintCanvas は Canvasの拡張クラスで、 マウスのイベントを直接処理することができます。 そのために MouseListener と MouseMotionListenerを実装した innerクラスを内部に持っています。
描画された内容が他のウィンドウに隠されたような場合に備え、 ダブルバッファの仕組み によって絵の回復が可能になっています。
参照: PaintCanvas のソース PaintCanvas.java

・ ControlPanelは JPanelのサブクラスで、 下記の3種類の Swingコンポーネントを用いて GUI を構築します。

  1. 色を選択するための JColorChooser
  2. 線の太さを選択するための JSlider
  3. 線の端の形を選択する JRadioButton(2個)

参照: ControlPanel のソース ControlPanel.java

JColorChooser
JSlider
JRadioButton(2個)

・ この他に画面に表示されるクラスではありませんが、 次のようなクラスがあります。
まず、線の色と形状を記憶するための Pen という名前のクラスです。 このクラスは ColotrolPanelのコンポーネントの操作に応じて 適当な Color と BasicStrokeのオブジェクトを生成し、 PaintCanvasの描画処理の中で利用します。
参照:Pen のソース Pen.java

・ この他に、各 Swingコンポーネントのイベントを処理するアダプタの クラスを3個定義します。

・ PaintCanvas と各 Swingコンポーネントの処理するイベントは、 それぞれ種類が微妙に異なります。 これは JDKの歴史的な変化にも関係があります。 表にまとめて比較してみましょう。

イベントの種類と特徴
コンポーネント名イベントのクラス名特徴
CanvasMouseEvent ユーザー入力の情報を直接取り扱うイベント
JColorChooserChangeEvent JavaBeansのプロパティの変化のイベント
複合的なコンポーネントのため、内部の部品から間接的に伝えられる
JSliderChangeEvent Swingで新しく追加された抽象化されたイベント (AWTEventのサブクラスではない)
JRadioButtonItemEvent JDK1.1から存在するイベント(AWTEventのサブクラス)