Установить свойство для всех дочерних компонентов

Я никогда раньше не использовал Java AWT, и теперь у меня есть фрагмент кода, который отображает JFrame и устанавливает для свойства шрифта для всех дочерних компонентов одно и то же значение. Я хочу установить свойство только в одном месте. Как я могу это сделать?

В .NET/WinForms дочерние элементы управления наследуются от своих родительских элементов управления, поэтому было бы достаточно установить шрифт для экземпляра Form, чтобы он распространялся на все элементы управления. Неожиданно оказалось, что это не относится к AWT.

Следующий небольшой код рекурсивно устанавливает шрифт для всех компонентов:

private void setFontForAll(JFrame f, java.awt.Font font) {
    f.setFont(font);
    setFontRecursive(f.getContentPane().getComponents(), font);
}

private static void setFontRecursive(Component[] components, java.awt.Font font) {
    for (Component c : components) {
        c.setFont(font);
        if (c instanceof java.awt.Container)
            setFontRecursive(((java.awt.Container)c).getComponents(), font);
    }
}

Однако у него есть четыре недостатка:

  1. Дополнительный код, который может оказаться весьма неэффективным для больших форм с вложенными панелями макета.
  2. Код не универсальный. Если мне нужно будет сделать то же самое для другого свойства в будущем, я должен переписать метод (или реорганизовать его, чтобы сделать его более общим за счет краткости).
  3. Использование не является декларативным, т. е. должно вызываться в самом конце создания формы (после того, как все дочерние компоненты были инициализированы и добавлены), а не где-либо декларативным образом.
  4. Это не работает. Компоненты настроены правильно, но не все вещи являются компонентами. Например, TitledBorders из JPanels не устанавливаются.

person Konrad Rudolph    schedule 23.05.2009    source источник


Ответы (2)


Вам нужен класс UIManager. Перед созданием пользовательского интерфейса просто скажите ему, какие шрифты вам нужны. Однако будьте осторожны; определено много клавиш шрифта, и если вы хотите изменить их все, вам придется установить их все.

UIManager.put( "Button.font", new Font( "Verdana", Font.BOLD, 12f );
UIManager.put( "Label.font", new Font( "Wingdings", Font.ITALIC, 12f );
// ...etc...

Вы можете увидеть ключи и значения, установленные программным путем, проверив UIManager.getDefaults(), который возвращает хеш-таблицу.

person banjollity    schedule 23.05.2009
comment
Спасибо, выглядит довольно универсально. - person Konrad Rudolph; 24.05.2009

Для Swing вы также можете установить шрифты с помощью аргументов командной строки:

# java -Dswing.plaf.metal.controlFont=Georgia -Dswing.plaf.metal.userFont=Tahoma -jar foo.jar foo.Foo

Добавьте -Dswing.aatext=true для сглаживания, благодаря чему весь графический интерфейс выглядит намного лучше. :)

person Bombe    schedule 24.05.2009