Swingベースのシンプルなスケッチアプリ
概要
JavaFXがjdkに同梱されなくなったため,今後,JVM上で動作するGUIアプリの開発は,Swingベースで行うことにしようと思います. そこで,シンプルなスケッチアプリを題材として,SwingベースのGUIアプリのテンプレートを作成しました. 本記事では,まずそのソースコードと動作例を示した上で,以下の点に焦点を当てて解説します.
- ウィンドウの表示
- イベントリスナの登録
- 折れ線の描画
ソースコード
Kotlin
Java
動作例
解説
プログラムを起動すると以下の流れで処理が実行されます.
main
が実行されるSwingUtilities.invokeLater
が実行されるSwingSketchApp
のrun
が実行される
ウィンドウの表示
JFrame
はウィンドウを表すクラスです.
// ウィンドウの表示
の部分ではJFrame
のインスタンスを生成してウィンドウを表示しています.
具体的には以下の項目を設定した後,setVisible
にtrue
を渡すことでウィンドウが表示されます.
- ウィンドウのタイトル:
JFrame
のコンストラクタに渡した文字列はウィンドウのタイトルとなります. - 閉じるボタンを押した時の動作:
setDefaultCloseOperation
にJFrame.EXIT_ON_CLOSE
を渡すとウィンドウの閉じるボタンを押した時にプログラムを終了します. - ウィンドウが持つコンテンツ:
add
はウィンドウにコンテンツを追加します. - ウィンドウのサイズ:
pack
を呼び出すとウィンドウのサイズをコンテンツに応じて調整します.
イベントリスナの登録
アプリケーションにユーザの入力に応じた処理を実行させるためにはイベントリスナを登録する必要があります.
イベントとはプログラムの状態の変化をトリガーとして生成されるオブジェクトです.
例えば,ユーザがマウスのボタンを押すことでプログラム内のマウス押下状態が変化した時やユーザがマウスドラッグすることでプログラム内のマウス位置が変化した時にはMouseEvent
クラスのインスタンスが生成されます.
イベントリスナとはイベントが生成された時にそのイベントを引数にして実行されるメソッドまたはそのようなメソッドを持つクラスです.
// イベントリスナの登録
の部分ではイベントリスナとしてMouseInputListener
のインスタンスlistener
を生成し,これをpanel
に登録しています.
これにより,panel
の上でユーザがマウスのボタンを押した時やマウスドラッグした時に,そのイベントに応じたlistener
のメソッドが実行されるようになります.
折れ線の描画
JPanel
はコンテンツを追加できる汎用的なパネルを表すクラスです.
JPanel
のpaint
をオーバーライドすることで図形を描画することができます.
ここではシンプルなスケッチを実現するためにユーザのドラッグにより入力された点列を折れ線として描画します.
具体的には// 折れ線の描画
の部分で示すように,paint
に引数として渡されるGraphics2D
のインスタンスに対して,Point2D
のリストとして表された点列をLine2D
として表される線分で繋いでいます.
Graphics2D
の使い方は以下の記事が参考になると思います.
jumpaku.hatenablog.com