【问题标题】:Change font size of a JPanel and all its elements更改 JPanel 及其所有元素的字体大小
【发布时间】:2010-06-07 11:44:54
【问题描述】:

我正在尝试创建一个 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 面板及其所有组件、元素等(即面板中的所有内容)的字体属性?

感谢您的想法

【问题讨论】:

    标签: java swing


    【解决方案1】:

    你可以使用这个技巧:

    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);
        }
    }
    

    生产:

    【讨论】:

    • 我只想更改面板的字体及其所有元素。我不想更改其他面板的字体。使用 UIManager 执行此操作会更改所有 Swing 组件的字体。
    • 啊,好点子。没有意识到你真正需要什么。既然我理解了您的问题,不知道如何(或是否有可能)解决它。
    • 一个“备份”解决方案是像你现在做的那样做,但也通过getBorderinstanceof TitledBorder/TitledBorder.setTitleFont等检查和更新边界
    【解决方案2】:

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

    【讨论】:

    • 它不适用于面板内的所有元素。例如:一个 JPanel 有一个带有标签的 JPanel。
    • 可能不适用于边框,但您可以将任何您喜欢的代码放入您的“添加”实现中,因此您没有理由不能在您的问题中调用类似代码的内容。基本上,我认为这没有一个简单的答案。这是一个“不整洁”的操作。
    猜你喜欢
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    • 2012-05-08
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多