2

Java アプリケーションでSubstance L&F ライブラリを使用したいので、.jar ファイルをダウンロードしてプロジェクトのクラスパスに追加しました。main()次に、アプリケーションの関数で L&F を次のように設定します。

SwingUtilities.invokeAndWait(new Runnable()
{
    @Override
    public void run()
    {
        try
        {
            // Substance
            String skin = "org.pushingpixels.substance.api.skin.SubstanceGraphiteAquaLookAndFeel";
            SubstanceLookAndFeel.setSkin(skin);
            JFrame.setDefaultLookAndFeelDecorated(true);
            JDialog.setDefaultLookAndFeelDecorated(true);
        }
        catch(Exception e)
        {
            System.err.println("Can't initialize specified look&feel");
            e.printStackTrace();
        }
    }
});

これは、JFrame が作成される前に行われます。ただし、例外がスローされなくても何も起こらず、GUI はデフォルトの Swing L&F でレンダリングされます。

私がここで見逃しているアイデアはありますか?

編集
呼び出し の代わりに、代わりSubstanceLookAndFeel.setSkin(skin);に試しましUIManager.setLookAndFeel(skin);た。これはまだ機能しませんが、少なくとも今は例外が発生します:

org.pushingpixels.substance.api.UiThreadingViolationException:
イベント ディスパッチ スレッドで状態追跡を行う必要があります

これを経由で呼び出すことで解決しませんinvokeAndWait()か?

EDIT-2
わかりました。問題は別のものでした。JTableL&F の設定時ではなく、の作成時に例外がスローされました。を介してコンストラクターを呼び出すことでJFrame(基本的にアプリケーション全体を実行します) 、L&F が正しくレンダリングされるようになりましたEventQueue.invokeLater()。しかし、私は以前にそれをしたことがありません.そのようにするのは「保存」(Java用語で有効)ですか?

4

1 に答える 1

4

設定にはちょっとしたコツがありますSubstance LaF。に電話UIManager.setLookAndFeel(new SubstanceGraphiteAquaLookAndFeel());する前に電話する必要がありますUIManager.setLookAndFeel("org.pushingpixels.substance.api.skin.SubstanceGraphiteAquaLookAndFeel");。したがって、次のように設定します。

public class App {

    public static void main(String [] args) {
        try {

            UIManager.setLookAndFeel(new SubstanceGraphiteAquaLookAndFeel());
            UIManager.setLookAndFeel("org.pushingpixels.substance.api.skin.SubstanceGraphiteAquaLookAndFeel");    

        } catch (ClassNotFoundException | InstantiationException
                | IllegalAccessException | UnsupportedLookAndFeelException e1) {
            e1.printStackTrace();
        }
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                //Your GUI code goes here..
            }
        });

    }
}
于 2013-10-30T23:15:58.433 に答える