Swingベースのシンプルなスケッチアプリ

概要

JavaFXjdkに同梱されなくなったため,今後,JVM上で動作するGUIアプリの開発は,Swingベースで行うことにしようと思います. そこで,シンプルなスケッチアプリを題材として,SwingベースのGUIアプリのテンプレートを作成しました. 本記事では,まずそのソースコードと動作例を示した上で,以下の点に焦点を当てて解説します.

  • ウィンドウの表示
  • イベントリスナの登録
  • 折れ線の描画

ソースコード

Kotlin

Java

動作例

f:id:Jumpaku:20200526184148p:plain
動作例

解説

プログラムを起動すると以下の流れで処理が実行されます.

  1. mainが実行される
  2. SwingUtilities.invokeLaterが実行される
  3. SwingSketchApprunが実行される

ウィンドウの表示

JFrameはウィンドウを表すクラスです. // ウィンドウの表示の部分ではJFrameインスタンスを生成してウィンドウを表示しています. 具体的には以下の項目を設定した後,setVisibletrueを渡すことでウィンドウが表示されます.

  • ウィンドウのタイトル:JFrameのコンストラクタに渡した文字列はウィンドウのタイトルとなります.
  • 閉じるボタンを押した時の動作:setDefaultCloseOperationJFrame.EXIT_ON_CLOSEを渡すとウィンドウの閉じるボタンを押した時にプログラムを終了します.
  • ウィンドウが持つコンテンツ:addはウィンドウにコンテンツを追加します.
  • ウィンドウのサイズ:packを呼び出すとウィンドウのサイズをコンテンツに応じて調整します.

イベントリスナの登録

アプリケーションにユーザの入力に応じた処理を実行させるためにはイベントリスナを登録する必要があります. イベントとはプログラムの状態の変化をトリガーとして生成されるオブジェクトです. 例えば,ユーザがマウスのボタンを押すことでプログラム内のマウス押下状態が変化した時やユーザがマウスドラッグすることでプログラム内のマウス位置が変化した時にはMouseEventクラスのインスタンスが生成されます. イベントリスナとはイベントが生成された時にそのイベントを引数にして実行されるメソッドまたはそのようなメソッドを持つクラスです.

// イベントリスナの登録の部分ではイベントリスナとしてMouseInputListenerインスタンスlistenerを生成し,これをpanelに登録しています. これにより,panelの上でユーザがマウスのボタンを押した時やマウスドラッグした時に,そのイベントに応じたlistenerのメソッドが実行されるようになります.

折れ線の描画

JPanelはコンテンツを追加できる汎用的なパネルを表すクラスです. JPanelpaintをオーバーライドすることで図形を描画することができます. ここではシンプルなスケッチを実現するためにユーザのドラッグにより入力された点列を折れ線として描画します. 具体的には// 折れ線の描画の部分で示すように,paintに引数として渡されるGraphics2Dインスタンスに対して,Point2Dのリストとして表された点列をLine2Dとして表される線分で繋いでいます.

Graphics2Dの使い方は以下の記事が参考になると思います. jumpaku.hatenablog.com