Вещество 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..
}
});
}
}