Swingを使う

とりあえずイベントを扱う練習。ボタンを押したらHelloと表示するサンプル。
関数を渡せる言語だと、actionPerformedメソッドの中身を渡してインスタンスが作れるので便利だ。
デバッグ用にインタプリタ内から実行するときは、閉じるボタンでインタプリタまで終了しないように
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
の所をコメントアウトする。

import javax.swing._
import java.awt._
import java.awt.event._

class Btn(t:String,f:ActionEvent=>Unit) extends JButton with ActionListener{
  setText(t)
  override def actionPerformed(e:ActionEvent) = f(e)
  addActionListener(this)
}

object BtnTest extends Application{
  val jf = new JFrame("BtnTest")
  val cp = jf.getContentPane
  cp.setLayout(new FlowLayout)
  cp.add(new Btn("OK",e=>JOptionPane.showMessageDialog(jf,"Hello")))
  cp.add(new Btn("実行",e=>JOptionPane.showMessageDialog(jf,"こんちは")))
  jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
  jf.setSize(200,100)
  jf.setVisible(true)
}

fsc

fscというコマンドを使うとコンパイラをデーモンとして起動するので、コンパイラの起動時間が省けるらしい。
以下の2つのやり方はどっちが速いんだろう。
体感的には:lの方が速い気がするんだけど、単に途中経過が見えてるからなのかな。

> fsc BtnTest.scala
> scala BtnTest
scala> :l BtnTest.scala
scala> BtnTest.main(null)

その他気がついた点。
fsc(というかscalac)を使う方はソースコードをデフォルトでUTF-8として解釈
:loadを使う方は、ソースコードShift_JISとして解釈(DOS窓の影響?)
BtnTest.main(null)で実行するとたまにこけることがある。そのときは:loadからやり直すと実行出来る。
fscを使う方は.classファイルが作られるが、:loadの方は作られない。