2010-11-18 28 views
0

我與一些小部件,以及命令行我想改變自己的外觀和感覺提出申請:更改揮杆L&F在命令行中不能很好地工作

java -Dswing.defaultlaf=com.sun.java.swing.plaf.windows.WindowsLookAndFeel LookAndFeelAppl 

但調用後,該命令只有一個widget到類的構造函數改變其L & F但其他我創建成一個單獨的方法不要!此外,該JFrame本身不會改變。

公共類LookAndFeelAppl擴展JFrame 私有JLabel標籤; 私人JButton按鈕;

public LookAndFeelAppl() 
{ 
    super("Look And Feel Demo"); 

    setLayout(null); 

    final UIManager.LookAndFeelInfo plaf[] = UIManager.getInstalledLookAndFeels(); 

    JLabel lable_laf = new JLabel("Choose L&F:"); 
    final JComboBox cb = new JComboBox(); 

    createOtherGUI(); 

    cb.addItemListener(new ItemListener() 
    { 
     public void itemStateChanged(ItemEvent e) 
     { 
      int ix = cb.getSelectedIndex(); 
      try 
      { 
       UIManager.setLookAndFeel(plaf[ix].getClassName()); 
       SwingUtilities.updateComponentTreeUI(LookAndFeelAppl.this); 
      } 
      catch (Exception ex) 
      { 
      } 
     } 
    }); 

    // HERE IS THE PROBLEM!!!! THIS LOOP GOES BEFORE 
    // THE ITEMLISTENER BECAUSE WHEN I ADD ITEMS AN ITEMEVENT 
    // IS RAISED THAT SET AGAIN THE L&F WITH setLookAndFeel!!! 
    for (int i = 0, n = plaf.length; i < n; i++) 
    { 
     cb.addItem(plaf[i].getName()); 
    } 
    //-------------------------------------------------------- 

    add(lable_laf); 
    add(cb); 
    lable_laf.setBounds(10, 10, 150, 25); 
    cb.setBounds(10, 35, 150, 25); 
} 

public void createOtherGUI() 
{ 
    button = new JButton("BUTTON!!!!"); 
    add(button); 
    button.setBounds(300, 45, 150, 35); 
} 

public static void main(String args[]) 
{ 
    LookAndFeelAppl window = new LookAndFeelAppl(); 
    window.setSize(1000, 700); 
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    window.setVisible(true); 
    window.setLocationRelativeTo(null); 
} 

}

+1

一些截圖? – 2010-11-18 11:44:33

+0

因此,createOtherGUI()不能像它應該那樣工作?如果我們有它的來源,這將有所幫助。 – josefx 2010-11-18 11:52:28

+0

不編譯。你的類是否擴展'JFrame',但是你忘了在你的代碼片段中添加它? – Qwerky 2010-11-18 12:21:56

回答

0

幾件事情要嘗試和問題:

  1. 我看你設定爲L & F代表窗口,所以我假設你在Windows中運行此?我問的原因是我不確定JDK支持什麼,就跨平臺的L & F而言,只是想一想。
  2. 你試過其他L & Fs有相同的結果嗎? (例如Nimbus)
  3. 這可能會也可能不會做任何事情,但你有哪些地方main(...)?嘗試將它放入JFrame中,並放入構建JFrame的單獨類中。
  4. 最糟糕的是,您可以始終將L & F classname作爲參數傳遞給main(...)(或道具文件),然後使用UIManager在創建任何擺動組件之前對其進行設置。

祝你好運, 戴夫

+0

我在Windows和其他J&F中給出了相同的結果。主要在同一班。 – xdevel2000 2010-11-18 12:30:58

+0

我創建了一個應用程序,它適用於我。我發佈另一個答案,所以我可以格式化(無法弄清楚如何與這些評論) – Merky 2010-11-18 12:38:25

+0

謝謝,我會嘗試它,然後我告訴你的結果! – xdevel2000 2010-11-18 13:03:28

2

我在Windows上使用JDK 1.6.0_13跑這在Eclipse(最新版本)。在Eclipse的運行配置(VM參數)我用-Dswing.defaultlaf=com.sun.java.swing.plaf.windows.WindowsLookAndFeel

public class Test extends JFrame {

public Test() {

super("Test L&F"); 

JComboBox box = new JComboBox(new String[] {"One", "Two", "Three"}); 

getContentPane().add(box, BorderLayout.SOUTH); 

createControls(); 

setSize(300, 300); 
setVisible(true); 

}

private void createControls() {

JComboBox box = new JComboBox(new String[] {"One", "Two", "Three"}); 

getContentPane().add(box, BorderLayout.NORTH); 

}

public static void main(String[] args) { new Test(); } }

對不起,格式是奇怪,但你的想法...

+0

好的,我發現了這個問題,你可以看到我發佈的完整代碼。然而,我想告訴你兩件事情:首先不管,對於L&F如果不使用佈局管理器,其次使用add方法時,它會自動將組件添加到內容窗格。閱讀:http://mindprod.com/jgloss/pane.html。最後,我想感謝你的答案,所以+1你的答案! – xdevel2000 2010-11-19 07:58:13

+0

感謝您的信息(和+1)!我沒有意識到,Sun(現在的Oracle ugg)對內容窗格中的內容「表示了很大的關注」(顯示了我使用Java的時間長度,我不知道它包含在1.5中!)。再次,感謝您的信息,我很高興你明白了! – Merky 2010-11-19 16:52:11

相關問題