Scala の Swing サポート#1 SimpleSwingApplication とレイアウトマネージャ

Hello, World!

単純な Swing アプリケーションは以下のように SimpleSwingApplication を継承することで簡単に作成することができます。

import swing._ 

object Example extends SimpleSwingApplication { 
  def top = new MainFrame { 
    title = "Hello, World!" 
    contents = new Button { 
      text = "Click Me!" 
    } 
  } 
}

SimpleSwingApplication は単一のフレーム(Window)を持つ Swing アプリケーションを作成できます。Frame を返却する top メソッドを作成し、上記例では title と contents としてボタンを設定しています。


実行結果は以下のようになります。

SwingApplication と SimpleSwingApplication

SimpleSwingApplication の実装は以下のようになっており、top として単一の Frame を保持しています。

abstract class SimpleSwingApplication extends SwingApplication {
  def top: Frame
  override def startup(args: Array[String]) {
    val t = top
    ・・・

SwingApplication では以下のようにEDT(Event Dissipate Thread)で startup() メソッドを実行します。

abstract class SwingApplication extends Reactor {
  def main(args: Array[String]) = Swing.onEDT { startup(args) }
  
  def startup(args: Array[String])
  def quit() { shutdown(); System.exit(0) }
  def shutdown() {}
}

quit() メソッドはアプリケーション終了時に呼び出され、Cliant コードにて shutdown() をオーバーライドすることで終了時の振る舞いをカスタマイズすることができます。

レイアウトマネージャ

Java での Swing では Panel にレイアウトマネージャを設定しますが、Scala ではレイアウトマネージャを適用したパネルが用意されています。
BorderLayout に対応する BorderPanel を使用する場合は以下のようになります。

import swing._ 

object Example002 extends SimpleSwingApplication {  
  def top = new MainFrame { 
    title = "BorderPanel" 
    contents = new BorderPanel {
    	import BorderPanel.Position._
    	add(new Button("North"),North)
    	add(new Button("Center"),Center)
    	add(new Button("South"),South)
    } 
  } 
}


実行結果は以下のようになります。

パネルには GridPanel や FlowPanel など、各種 LayoutManager に対応したものが用意されています。