更改JPanel及其所有元素的字体大小

时间:2010-06-07 11:44:55

标签: java swing

我正在尝试创建一个Swing面板,其元素的字体大小与swing应用程序的其余部分不同。最初,将setFont用于几个组件并没有造成任何问题。现在我有几个组件(及其所有子组件),因此这个解决方案是不切实际的。

我搜索过有关更改swing组件的默认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面板及其所有组件,元素等的字体属性(即面板中的所有内容)吗?

感谢您的想法

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您可以覆盖基础组件上的add方法,并将字体应用于添加的组件及其子组件。这可以节省您在以后添加组件时手动应用字体。