2013-10-30 46 views
1

我想在我的Java應用程序中使用F庫,所以我下載了.jar文件並將它們添加到項目類路徑中。然後,我想設置爲L &的F應用程序的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
好的,所以問題有所不同。在創建JTable時拋出異常,而不是在設置L & F.時,我能夠通過EventQueue.invokeLater()調用JFrame構造函數(然後基本上運行整個應用程序)來正確地呈現該問題 - L & F已正確呈現。但是我從來沒有這樣做過,是否以這種方式「保存」(用Java術語來說是有效的)?

+0

調用'SwingUtilities.invokeLater()'以確保它會在EventDispatchThread – nachokk

+0

@nachokk叫:我通過'invokeAndWait(這樣做)',但即使'的invokeLater ()'我得到同樣的異常。 – Matthias

回答

3

設置Substance LaF時有一個小竅門。在致電UIManager.setLookAndFeel("org.pushingpixels.substance.api.skin.SubstanceGraphiteAquaLookAndFeel");之前,您必須致電UIManager.setLookAndFeel(new 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.. 
      } 
     }); 

    } 
} 
+0

好的,我解決了我的OP中EDIT-2中描述的問題。所描述的是否有效? – Matthias

+0

直到你使用'invokeLater',是的。 –

+0

不正確'UIManager.setLookAndFeel(new SubstanceGraphiteAquaLookAndFeel());'應該在所有情況下都包裝到invokeLater中 – mKorbel