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)
- 作者: チェット・ハーゼ,ロマン・ガイン,Chet Haase,Romain Guy,松田晃一,小沼千絵
- 出版社/メーカー: ピアソンエデュケーション
- 発売日: 2008/11/26
- メディア: 単行本(ソフトカバー)
- 購入: 2人 クリック: 42回
- この商品を含むブログ (20件) を見る
*1:ダイアログの Look & Feel も変えたいなら(普通そうだろうけど)、「JDialog.setDefaultLookAndFeelDecorated(true);」も必要。