2010-06-07 52 views
6

我試圖創建一個Swing面板,其元素的字體大小與其他的swing應用程序不同。最初,對幾個組件使用setFont沒有造成任何問題。現在我有幾個組件(以及它們的所有子組件),所以這個解決方案是不切實際的。更改JPanel及其所有元素的字體大小

我搜索了關於更改擺動組件的默認UI屬性。我發現的主要是使用UIManager,它會改變全局屬性。這對我不起作用,因爲我想保留所有其他面板的當前字體設置。

眼下(因爲我不喜歡夏奈爾首先嚐試的東西了),我有一個這樣的算法:

public static void fixFont(Container c) { 
    c.setFont(c.getFont().deriveFont(10.0f)); 
    Component[] comp = c.getComponents(); 
    for (int i=0;i<comp.length;++i) { 
     if (comp[i] instanceof Container) { 
      fixFont((Container) comp[i]); 
     } else { 
      comp[i].setFont(comp[i].getFont().deriveFont(10.0f)); 
     } 
    } 
} 

的問題是:

  • 它不包括某些擺動元素,如邊框。
  • 我有當我添加其他組件來調用這個函數動態

問:有另一種方式來改變一個Swing面板的字體屬性和它的所有部件,元件等(即一切面板)?

感謝您的想法

回答

4

您可以使用這一招:

import java.awt.*; 

public class FrameTest { 

    public static void setUIFont(FontUIResource f) { 
     Enumeration keys = UIManager.getDefaults().keys(); 
     while (keys.hasMoreElements()) { 
      Object key = keys.nextElement(); 
      Object value = UIManager.get(key); 
      if (value instanceof FontUIResource) { 
       FontUIResource orig = (FontUIResource) value; 
       Font font = new Font(f.getFontName(), orig.getStyle(), f.getSize()); 
       UIManager.put(key, new FontUIResource(font)); 
      } 
     } 
    } 

    public static void main(String[] args) throws InterruptedException { 

     setUIFont(new FontUIResource(new Font("Arial", 0, 20))); 

     JFrame f = new JFrame("Demo"); 
     f.getContentPane().setLayout(new BorderLayout()); 

     JPanel p = new JPanel(); 
     p.add(new JLabel("hello")); 
     p.setBorder(BorderFactory.createTitledBorder("Test Title")); 

     f.add(p); 

     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setSize(300, 300); 
     f.setVisible(true); 
    } 
} 

產地:

enter image description here

+0

我只想更改面板及其所有元素的字體。我不想改變其他面板的字體。使用UIManager執行此操作會更改所有Swing組件的字體。 – YuppieNetworking 2010-06-07 12:39:37

+0

啊,好點。沒有意識到你真的需要什麼。不知道如何(或者如果有可能)現在解決它,我明白你的問題。 – aioobe 2010-06-07 12:53:19

+1

一個「備份」解決方案就像現在這樣做,但也通過'getBorder'和'instanceof TitledBorder' /'TitledBorder.setTitleFont'等來檢查和更新邊框。 – aioobe 2010-06-07 12:57:05

1

您可以覆蓋你的基本組件上的add方法和應用字體到那裏添加的組件和他們的孩子。這將節省您稍後添加組件時手動應用字體。

+0

仍然不會爲邊框等工作... – aioobe 2010-06-07 12:39:56

+0

它不適用於面板內的所有元素。例如:一個帶有標籤的JPanel的JPanel。 – YuppieNetworking 2010-06-07 12:47:05

+0

可能不適用於邊界,但是您可以將任何代碼放入「添加」實現中,因此沒有理由不能在您的問題中調用類似代碼的內容。基本上,我不認爲這是一個簡單的答案。這是一個'不整潔'的操作。 – pstanton 2010-06-07 21:22:30