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

Java 更改JPanel及其所有元素的字体大小,java,swing,Java,Swing,我试图创建一个Swing面板,其元素的字体大小与Swing应用程序的其余部分不同。最初,对几个组件使用setFont,不会带来任何问题。现在我有几个组件(以及它们的所有子组件),所以这个解决方案是不切实际的 我搜索了有关更改swing组件的默认UI属性的信息。我发现主要是使用UIManager,它可以全局更改属性。这对我不起作用,因为我想保留所有其他面板的当前字体设置 目前(由于我不喜欢在没有先尝试的情况下发布),我有一个这样的算法: public static void fixFont(Con

我试图创建一个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));
        }
    }
}
publicstaticvoidfixfont(容器c){
c、 setFont(c.getFont().deriveFont(10.0f));
Component[]comp=c.getComponents();

对于(int i=0;i您可以使用以下技巧:

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);
    }
}
产生:


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

我只想更改面板及其所有元素的字体。我不想更改其他面板的字体。使用UIManager进行此操作会更改所有Swing组件的字体。啊,这一点很好。我没有意识到您真正需要的是什么。现在我理解了您的问题,不确定如何(或是否可能)解决它。一个“备份”解决方案是像现在这样做,但也要通过标题边界的
getBorder
instanceof TitledBorder
/
TitledBorder来检查和更新边框。setTitleFont
etcIt不会对面板内的所有元素都起作用。例如:具有带有标签的JPanel的JPanel可能不适用于边框,但您可以你可以在“添加”实现中调用任何你喜欢的代码,因此你没有理由不能调用你问题中的代码。基本上,我不认为有一个简单的答案。这是一个“不整洁”的操作。