倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

Groovy 内蔵のアイコン

Groovy に内蔵されている GroovyConsole に使用されているアイコンが使えないかなぁと思って groovy-xxx.jar の中身を覗いてみると、まぁ当然かもしれないけど、groovy.ui.Console クラスのソース近辺にそれぞれの画像ファイルがありました。

画像ファイルは全て PNG ファイルで、

  • groovy/ui
  • groovy/ui/icons

の2つのフォルダに配置されていました。 ファイル一覧:

アイコン リソース名 アイコン リソース名
groovy/ui/ConsoleIcon.png
groovy/ui/icons/arrow_redo.png groovy/ui/icons/arrow_undo.png
groovy/ui/icons/book_next.png groovy/ui/icons/book_previous.png
groovy/ui/icons/bullet_green.png groovy/ui/icons/cross.png
groovy/ui/icons/cut.png groovy/ui/icons/cut_red.png
groovy/ui/icons/disk.png groovy/ui/icons/find.png
groovy/ui/icons/folder_page.png groovy/ui/icons/page.png
groovy/ui/icons/page_copy.png groovy/ui/icons/page_paste.png
groovy/ui/icons/script_go.png groovy/ui/icons/text_replace.png

使ってみる


では、実際にこれらのアイコンを使ってみましょう。 上記のアイコンはシステムリソースなので、例えば以下のような、ClassLoader クラスの static メソッドで取得できます(システムリソースの読込方はこちらを参照):

java.io.InputStream ClassLoader.getSystemResourceAsStream(String name)
java.net.URL           ClassLoader.getSystemResource(String name)

どちらもメソッドの引数 (name) には上の表の「リソース名」を渡します。

ただ、アイコンの画像は GUI で使うのが常だと思うので、サンプルコードは SwingBuilder で使う方法を見ていきます(参考「SwingBuilder.imageIcon」)。 アイコンはツールバーに使うことが多いと思いますが(Groovy Console もそう)、ここでは普通のボタンにアイコンの画像を使ってみます(ツールバーもボタンなので使い方は同じ)。 ボタンに 'groovy/ui/ConsoleIcon.png' の画像を使うには

        button icon:imageIcon(resource:'groovy/ui/ConsoleIcon.png')
        // もしくは
        // button icon:imageIcon(resource:'/groovy/ui/ConsoleIcon.png')
        // 違いは・・・?

とします。 システムリソースの画像を使用する場合は imageIcon に resource プロパティを指定します。 動くサンプルはこんな感じ:

import java.awt.BorderLayout as BL
import javax.swing.WindowConstants as WC
import groovy.swing.SwingBuilder

def f = new SwingBuilder().frame(
        title:'Icons', pack:true,
        defaultCloseOperation:WC.EXIT_ON_CLOSE){
    borderLayout()

    panel(constraints:BL.NORTH){
        button 'ConsoleIcon.png', icon:imageIcon(resource:'groovy/ui/ConsoleIcon.png')
    }

    vbox{
        imageButton(builder, 'arrow_redo.png')
        imageButton(builder, 'arrow_undo.png')
        imageButton(builder, 'book_next.png')
        imageButton(builder, 'book_previous.png')
        imageButton(builder, 'bullet_green.png')
        imageButton(builder, 'cross.png')
        imageButton(builder, 'cut.png')
        imageButton(builder, 'cut_red.png')
        imageButton(builder, 'disk.png')
        imageButton(builder, 'find.png')
        imageButton(builder, 'folder_page.png')
        imageButton(builder, 'page.png')
        imageButton(builder, 'page_copy.png')
        imageButton(builder, 'page_paste.png')
        imageButton(builder, 'script_go.png')
        imageButton(builder, 'text_replace.png')
    }
}

f.visible = true

def imageButton(builder, String png){
    builder.hbox{
        button icon:builder.imageIcon(resource:'groovy/ui/icons/'+png)
        hglue()
        label png
        hglue()
    }
}

レイアウトを気にしなければもっと簡単に書けますけどね。 実行結果はこうなります:


New/Open/Save や Cut/Copy/Paste などのよく使いそうなアイコンがあるのは結構有り難いっす。
Groovyイン・アクション

Groovyイン・アクション