2010-04-16 54 views
0

任何人都知道爲什麼laf在下面的代碼中沒有改變? (在Ubuntu上運行)LookAndFeel在Ubuntu中沒有變化

import java.awt.Dialog; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JComboBox; 
import javax.swing.JDialog; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UIManager.LookAndFeelInfo; 

public class TEST extends JPanel { 

    public TEST() { 
    final LookAndFeelInfo[] lafArray = UIManager.getInstalledLookAndFeels(); 
    String[] names = new String[lafArray.length]; 
    for (int i = 0; i < names.length; i++) { 
     names[i] = lafArray[i].getName(); 
    } 

    final JComboBox cb = new JComboBox(names); 
    cb.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent ev) { 
     try { 
      int index = cb.getSelectedIndex(); 
      LookAndFeelInfo lafInfo = lafArray[index]; 
      String lafClassName = lafInfo.getClassName(); 
      System.out.println(lafClassName); 
      UIManager.setLookAndFeel(lafClassName); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     } 
    }); 

    add(cb); 
    } 

    public static void main(String[] args) throws Exception { 
    System.out.println("start"); 

    JDialog dialog = new JDialog(null, Dialog.ModalityType.APPLICATION_MODAL); 
    dialog.setContentPane(new TEST()); 
    dialog.pack(); 
    dialog.setLocationRelativeTo(null); 
    dialog.setVisible(true); 
    dialog.dispose(); 

    System.out.println("end"); 
    } 

} 

回答

2

一旦組件被渲染,您不應該改變外觀。它必須在組件初始化之前完成。從here

注意:如果你要設定爲L &男,你應該做的是在應用程序中的第一步。否則,無論您請求什麼L &F,都有可能會初始化Java L & F.當靜態字段引用Swing類時會發生這種情況,這會導致加載L & F.如果尚未指定F,則加載JRE的默認L & F.對於Sun的JRE,缺省值是Java L & F,Apple的JRE,Apple L & F等等。

+0

我想在運行時更改,就像SwingSet3那樣 – 2010-04-16 21:07:19

+0

根據應用程序,看起來像是要求用戶重新啓動應用程序沒有其他選擇。傷心。 – 2010-04-19 13:35:54

+0

@Tom:實際上,Java教程中的註釋指的是如果您沒有將L&F設置爲應用程序中的第一步,Java L&F可能會被初始化,即使這不是您想要的。這並不意味着你以後不能更改L&F。請參閱您鏈接到的頁面中的「更改啓動後的外觀」一節。 – Grodriguez 2010-09-22 12:20:52

4

你打電話UIManager.setLookAndFeel(lafClassName)後,調用SwingUtilities.updateComponentTreeUI(cb.getParent)。在更完整的應用程序中,您必須在每個頂級Container上調用它。由於lafs之間的組件大小不同,您還應該在Container上調用pack()

+0

我會盡力的。 奇怪的是,我並不需要這在我家運行在Windows中。 – 2010-04-16 21:08:06

+0

@湯姆布里託:從來沒有,這是Sun的教程告訴你要做的事:http://java.sun.com/docs/books/tutorial/uiswing/lookandfeel/plaf.html#dynamic – Powerlord 2010-04-16 21:09:28

+0

工作正常這個例子。但是沒有辦法更新所有擺動組件,即使它們不在樹中? – 2010-04-16 21:11:24