倭マン's BLOG

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

Substance のドキュメントはいずこに?

java.net の Web サイトがリニューアルされてるせいか、そこにある Swing アプリケーションの Look & Feel 開発プロジェクト「Substance」のドキュメントがどこかへ逝ってしまってますねぇ。 Substance の Look & Feel を使うには EDT (Event Dispatch Thread ) 内で UI の設定や GUI コンポーネントの生成を行わないといけないので、単純な Swing アプリケーションのコードでは動かないのが悩ましいところ。

ちょっとメモ程度に動くコードを載せておきます(UI の設定などはいくつか方法があったと思いますが・・・)。

Java コード

import javax.swing.*;
//import org.pushingpixels.substance.api.skin.SubstanceBusinessBlackSteelLookAndFeel;

public class SubstanceMain implements Runnable{

    public static void main(String... args){
        JFrame.setDefaultLookAndFeelDecorated(true);
        JDialog.setDefaultLookAndFeelDecorated(true);
        
        SwingUtilities.invokeLater(new SubstanceMain());
    }

    @Override
    public void run() {
        try{
            String laf = "BusinessBlackSteel";
            UIManager.setLookAndFeel("org.pushingpixels.substance.api.skin.Substance"+laf+"LookAndFeel");
            //UIManager.setLookAndFeel(new SubstanceBusinessBlackSteelLookAndFeel());

        }catch(UnsupportedLookAndFeelException ex){
            throw new RuntimeException(ex);
        }

        JFrame frame = new JFrame("Substance");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new JLabel("Substance Look & Feel Demo"));
        frame.pack();
        frame.setVisible(true);
    }
}
  • Look & Feel の変更を反映するには「JFrame.setDefaultLookAndFeelDecorated(true);」という設定をする必要があります*1。 これは EDT 外でもいいようです。
  • Java で EDT 内での実行を行うには SwingUtilities#invokeLater() メソッドを使います。 SwingUtilities#invokeAndWait() でも良かったかも。
  • EDT 内では、GUI コンポーネントの構築の前に UIManager#setLookAndFeel() メソッドで UI の Look & Feel を指定します。 メソッドの引数としては「LookAndFeel のサブクラス」もしくはその「クラスの完全修飾名の文字列」を渡します。 指定できる Look & Feel は結構あるので悩ましいところ(以前の記事に列挙してます)。

Groovy コード


Groovy ではもう少し簡単に書けますが、やってることは同じ。

//@Grab(group='org.java.net.substance', module='substance', version='6.0')

import groovy.swing.SwingBuilder
import javax.swing.*
//import org.pushingpixels.substance.api.skin.SubstanceBusinessBlackSteelLookAndFeel

JFrame.defaultLookAndFeelDecorated = true
JDialog.defaultLookAndFeelDecorated = true

new SwingBuilder().doLater{
    def laf = 'BusinessBlackSteel'
    UIManager.setLookAndFeel("org.pushingpixels.substance.api.skin.Substance${laf}LookAndFeel")
    //UIManager.setLookAndFeel(new SubstanceBusinessBlackSteelLookAndFeel())

    def f = frame(title:'Substance', pack:true, defaultCloseOperation:WindowConstants.EXIT_ON_CLOSE){
            label 'Substance Look & Feel Demo'
    }
    f.visible = true
}
  • Groovy では SwingUtilities#invokeLater() の代わりに SwingBuilder#doLater() を使うと簡潔。

Filthy Rich Clients アニメーションとグラフィカルエフェクトを使ったデスクトップJavaアプリケーション (The Java Series)

Filthy Rich Clients アニメーションとグラフィカルエフェクトを使ったデスクトップJavaアプリケーション (The Java Series)

  • 作者: チェット・ハーゼ,ロマン・ガイン,Chet Haase,Romain Guy,松田晃一,小沼千絵
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2008/11/26
  • メディア: 単行本(ソフトカバー)
  • 購入: 2人 クリック: 42回
  • この商品を含むブログ (20件) を見る

*1:ダイアログの Look & Feel も変えたいなら(普通そうだろうけど)、「JDialog.setDefaultLookAndFeelDecorated(true);」も必要。