GDKかSwingBuilderかよーわからんけど,Groovyのナゾがひとつ解けた

SwingBuilderにおける以下のようなコードに違和感を覚えつつも,お作法なんだろうからと深くは考えてなかったワケ。

button(text:"Click",
       actionPerformed: { /* ここにアクションを記述 */ })

でもね,JetGroovyで編集中にこんなコード補完を見つけてしまったのよ。それもSwingBuilder外で。


あれ?actionPerformedってJButtonのプロパティになってるやん。調子のって(↓)こんなことしたら,こっちもプロパティで出るし。


あれこれ調べてみた所,どうやらGroovyが気を利かせてJDKのクラスに独自の拡張を施しているみたい。一応,GDKの存在は知ってたつもりなんだけど,GDKのJavadocにSwingは見当たらなかったんだよなぁ。:-(
まあよい。JetGroovyを信じよう。今まで「無名クラスが作れないからSwingとGroovyの相性は悪い」と勝手に決めつけてたのは払拭しとこう。
ずーっとActionListener以外のイベントリスナ使うのは面倒なんだろうなと敬遠していたコードは,実はすんなり書けるハズ,ってことでちょうどxibbarさんとこに手頃な例があったので,Groovy Scriptで書いてみたよ。

import groovy.swing.SwingBuilder
import static javax.swing.WindowConstants.*

def x0, y0
SwingBuilder.build {
  frame(title: "paint", size: [350, 250], visible: true,
        defaultCloseOperation: EXIT_ON_CLOSE) {
    panel(id: 'p',
          mousePressed: {evt ->
            x0 = evt.x
            y0 = evt.y
          },
          mouseDragged: {evt ->
            g = p.graphics
            x = evt.x
            y = evt.y
            g.drawLine(x0, y0, x, y)
            x0 = x
            y0 = y
          })
  }
}

えー,これはちょっと目からウロコかもー。

続きを読む