我想在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()调用不是解决方案吗?

编辑2
好的,所以问题有所不同。创建JTable时抛出异常,而不是在设置L&F时抛出该异常。我能够通过JFrame调用EventQueue.invokeLater()构造函数(然后基本上运行整个应用程序)来解决该问题-现在可以正确呈现L&F。但是我以前从未做过,那样做是“保存”(在Java中有效)吗?

最佳答案

设置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..
            }
        });

    }
}

07-24 09:24