Изменить размер шрифта JPanel и всех его элементов - PullRequest
6 голосов
/ 07 июня 2010

Я пытаюсь создать панель 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 и всех ее компонентов, элементов и т. Д. (Т. Е. Все на панели)?

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

Ответы [ 2 ]

4 голосов
/ 07 июня 2010

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

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 голос
/ 07 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...