■簡単なテキストエディタを作る (ついでにGroovyのエディタにもする)
Groovyでは、SwingBuilderを使うとSwingのGUIを簡単に作り出すことができる。最低限に近い記述で、メニューやフレームの構成を定義することができるので、社内で使うツールを作るのには重宝する(ようになるかもしれない..安定すれば)。
Javaなどのコンパイル言語で書いた場合は、ちょっとした修正が結構めんどくさい。開発環境を起動して、プロジェクトを開いて、どのクラスを修正するか思い出して(←時間が経つとこれが一番つらい)、修正して、デバッグして、配布しなおす(←これもかなり面倒)。
■GroovyMarkup
SwingBuilderの仕組みは、GroovyMarkupという面白い仕組み活用している。すごく面白いのでいずれ紹介したい。
■サンプル
さて、SwingBuilderで非常に簡単なテキストエディタを作る方法を下の方に書く。
ただのテキストエディタではつまらないので、Groovyの実行もできるようにしてみた。このGroovyプログラムを実行してから、実行メニュー(F11)を選ぶと、エディット中の文字列をGroovyとして実行します。つまり『Groovyでできた、Groovyエディタ』の第一歩というわけです。
使いながら、拡張できる、しかも拡張するのに自分自身を使って行う。そんな危険なツールを作ってみるのもおもろいかもしれません。
(さらにアプレット上でも動くようにしようという危険な試みにチャレンジしようとしましたが失敗。2005/8/2の日記参照)
SwingBuilderのテキストエディタを作るためのサンプルソース (JSR-2でしか検証していません
) |
import groovy.swing.*
import java.awt.event.*
import javax.swing.*
sw = new SwingBuilder()
file = null ;
f = sw.frame(title:"TextEditor" , size:[500,400]){
//--- MENU ---
menuBar{
menu("ファイル"){
menuItem("実行"
, actionPerformed:{doit()}
, accelerator:KeyStroke.getKeyStroke( KeyEvent.VK_F11 , 0 )
)
separator()
menuItem("開く" , actionPerformed:{open()} )
menuItem("保存" , actionPerformed:{save()} )
menuItem("別名保存" , actionPerformed:{saveAs()} )
separator()
menuItem("終了" , actionPerformed:{exit(0)} )
}
}
//--- TEXT EDITOR ---
scrollPane{
ta = textArea()
}
}
f.visible = true
//==========================================
// 終了
//==========================================
def exit(no){ f.dispose() }
//==========================================
// 書かれた文をGroovyとして実行する
//==========================================
def doit(){
if( ta.text != "" ){
new GroovyShell().evaluate( ta.text )
}
}
//==========================================
// ファイルを開く
//==========================================
def open(){
fc = sw.fileChooser()
if( file != null ) fc.selectedFile = file ;
if( fc.showOpenDialog() == fc.APPROVE_OPTION ){
ta.text = ( file = fc.selectedFile).text //テキストペインに設定
}
}
//==========================================
// ファイルを保存する
//==========================================
def saveAs(){
fc = sw.fileChooser()
if( file != null ) fc.selectedFile = file ;
if( fc.showSaveDialog() == fc.APPROVE_OPTION ){
save_exe( file = fc.selectedFile )
}
}
def save(){
if( file != null ) save_exe( file )
else saveAs()
}
def save_exe(dstFile){
dstFile.write( ta.text )
}
|
私のところではちゃんと動いていますが、動かない場合は気軽にご連絡ください。