単純なプログラムを書換えよう(Groovy編)−とりあえず書いてみた

Groovyに備わっているSwingBuilderを使用してGUIを作成する.とりあえず書いてみた.

//g1.groovy
import groovy.swing.SwingBuilder
import java.awt.BorderLayout

builder=new SwingBuilder()
view=builder.frame(defaultCloseOperation:javax.swing.WindowConstants.EXIT_ON_CLOSE,
                   size:[200,100]){
  //defaultCloseOperationのデフォルトはHIDE_ON_CLOSE.
  //EXIT_ON_CLOSEに変えてウィンドウを閉じたらvmも終わりにする.
  panel(layout:new BorderLayout()){
    value=label(text:"0",constraints:BorderLayout.CENTER)
    //buttonのactionPerformedの中で使うのでlabelにvalueと名前をつける
    panel(constraints:BorderLayout.SOUTH) {
      button(text:'inc', actionPerformed:{value.text=Integer.toString(value.text.toInteger()+1)})
      button(text:'dec', actionPerformed:{value.text=Integer.toString(value.text.toInteger()-1)})
    }
  }
}
view.show()
//end
  

こんな画面になる.

GroovyはJavaと異なり,クラスは任意である.クラスを定義した場合は,クラス名とファイル名を合わせる必要があるが,定義しない場合は適当な名前をつけてかまわない.ここではg1.groovyとなっている.

ボタンを押した際に行う処理内容は,buttonのactionPerformedにクロージャとして指定している.actionPerformedのクロージャには別関数を指定することも可能である.

//g1.groovy
import groovy.swing.SwingBuilder
import java.awt.BorderLayout

builder=new SwingBuilder()
view=builder.frame(defaultCloseOperation:javax.swing.WindowConstants.EXIT_ON_CLOSE,
                   size:[200,100]){
  panel(layout:new BorderLayout()){
    value=label(text:"0",constraints:BorderLayout.CENTER)
    panel(constraints:BorderLayout.SOUTH) {
      button(text:'inc', actionPerformed:{action(it)}) //別関数actionを指定
      button(text:'dec', actionPerformed:{action(it)}) //別関数actionを指定
    }
  }
}
view.show()

def void action(event){
  actions=['inc':{value.text=Integer.toString(value.text.toInteger()+1)},
           'dec':{value.text=Integer.toString(value.text.toInteger()-1)}]
  actions[event.actionCommand]()
}
//end
  

ほぼ同じ画面をJava+AWTで作成すると以下のようになる.単純なプログラムを書換えよう(java編)のソースコードの一部である.

public View(){
  Frame frame=new Frame();
  Panel buttons=new Panel();
  Button inc=new Button("inc");
  Button dec=new Button("dec");
  buttons.add(inc);
  buttons.add(dec);
  inc.addActionListener(this);
  dec.addActionListener(this);
  frame.add(buttons,BorderLayout.SOUTH);
  frame.add(value,BorderLayout.CENTER);
  frame.addWindowListener(this);
  frame.pack();
  frame.show();
}  
  

こんな画面になる.