Изменение размера шрифта JPanel и всех его элементов

Я пытаюсь создать панель Swing, элементы которой имеют другой размер шрифта, чем остальная часть приложения swing. Первоначально, используя setFont для пары компонентов не было никаких проблем. Теперь у меня есть несколько компонентов (и их компонентами), поэтому такое решение нецелесообразно.

Я искал об изменении свойств пользовательского интерфейса по умолчанию компонентов swing. То, что я нашел, в основном использует 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, такие как его граница.
  • Я должен вызвать эту функцию, когда я добавляю другие компоненты динамически

вопрос: Is есть ли другой способ изменить свойства шрифта панели Swing и всех ее компонентов, элементов и т. д. (т. е. все в панели) ?

Спасибо за ваши идеи

2 ответов


вы можете использовать этот трюк:

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


можно переопределить add метод на базовом компоненте и применить шрифт к добавленным компонентам и их дочерним там. это сэкономит вам применение шрифта вручную, когда компоненты будут добавлены позже.