Установить свойство для всех дочерних компонентов - PullRequest
4 голосов
/ 23 мая 2009

Я никогда раньше не использовал 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. Не работает. Компоненты установлены правильно, но не все вещи являются компонентами. Например, TitledBorder с JPanel с не установлены.

Ответы [ 2 ]

8 голосов
/ 24 мая 2009

Класс UIManager - это то, что вам нужно. Прежде чем создавать свой пользовательский интерфейс, просто скажите ему, какие шрифты вы хотите. Будьте предупреждены, хотя; определено множество ключей шрифтов, и если вы хотите изменить их все, вам придется установить их все.

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

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

1 голос
/ 24 мая 2009

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

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

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

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