2009-05-23 262 views
4

我從未使用過Java AWT,現在我有一段代碼顯示JFrame,並將所有子組件的字體屬性設置爲相同的值。我想在一個地方設置屬性。我怎樣才能做到這一點?爲所有子組件設置屬性

在.NET/WinForms中,子控件繼承自它們的父控件,因此只需將Form實例的字體設置爲使其傳播到所有控件就足夠了。意外的是,這似乎並不適用於AWT。

以下很少的代碼設置所有部件的字體遞歸:

private void setFontForAll(JFrame f, java.awt.Font font) { 
    f.setFont(font); 
    setFontRecursive(f.getContentPane().getComponents(), font); 
} 

private static void setFontRecursive(Component[] components, java.awt.Font font) { 
    for (Component c : components) { 
     c.setFont(font); 
     if (c instanceof java.awt.Container) 
      setFontRecursive(((java.awt.Container)c).getComponents(), font); 
    } 
} 

但是,它有四個缺點:

  1. 額外的代碼,這實際上可能是大型表格嵌套相當低效佈局面板。
  2. 代碼是非通用的。如果我將來需要爲另一個屬性做同樣的事情,我必須重寫該方法(或者以簡潔爲代價將其重構爲更一般的方法)。
  3. 用法是非聲明式的,即必須在表單創建的最後(在所有子組件被初始化並添加之後)調用,而不是以聲明方式在任何地方調用。
  4. 它不起作用。組件設置正確,但並非所有的東西都是組件。例如,JPanelTitledBorder s沒有被設置。

回答

8

UIManager類是你需要的東西。在構建用戶界面之前,只需告訴它你想要的字體。儘管有所警告;有很多字體鍵被定義,如果你想改變它們,你必須全部設置它們。

UIManager.put("Button.font", new Font("Verdana", Font.BOLD, 12f); 
UIManager.put("Label.font", new Font("Wingdings", Font.ITALIC, 12f); 
// ...etc... 

您可以通過以編程方式檢查UIManager.getDefaults()返回哈希表來設置鍵和值。

+0

謝謝,這看起來相當多才多藝。 – 2009-05-24 08:17:37

1

揮杆,您還可以使用命令行參數設置字體:

# java -Dswing.plaf.metal.controlFont=Georgia -Dswing.plaf.metal.userFont=Tahoma -jar foo.jar foo.Foo 

添加-Dswing.aatext=true抗鋸齒這使得整個界面看起來要好很多。 :)