Вещество L&F не работает

Я хочу использовать библиотеку Substance L&F в своем Java-приложении, поэтому я скачал файлы.jar и добавил их в путь к классам проекта. Затем я хочу установить L&F в приложении main() функционировать так:

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. Однако, даже если исключение не выдается, ничего не происходит, графический интерфейс отображается в Swing L&F по умолчанию.

Есть идеи, что мне здесь не хватает?

РЕДАКТИРОВАТЬ
Вместо SubstanceLookAndFeel.setSkin(skin); позвони я попробовал это с UIManager.setLookAndFeel(skin); вместо. Это все еще не работает, но, по крайней мере, сейчас я получаю исключение:

org.pushingpixels.substance.api.UiThreadingViolationException:
Отслеживание состояния должно выполняться в потоке отправки событий

Разве это не решается путем вызова через invokeAndWait()?

РЕДАКТИРОВАТЬ-2
Итак, проблема была в другом. Исключение было сгенерировано при создании JTable, не при настройке L&F. Я смог решить проблему - L&F теперь корректно отображается - вызвав JFrame конструктор (который затем в основном выполняет все приложение) через EventQueue.invokeLater(), Но я никогда не делал этого раньше, это "сохранить" (допустимо в терминах Java), чтобы сделать это таким образом?

1 ответ

Решение

Есть небольшая хитрость при настройке 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..
            }
        });

    }
}
Другие вопросы по тегам