Подтвердить что ты не робот

Настройка программы Default Font of Swing

Мне было интересно, как установить шрифт по умолчанию для всей моей программы Java swing. Из моих исследований кажется, что это можно сделать с помощью UIManager, что-то связанное с LookAndFeel, но я не могу найти конкретно, как это сделать, а UIManager выглядит довольно сложно.

4b9b3361

Ответ 1

попробовать:

public static void setUIFont (javax.swing.plaf.FontUIResource f){
    java.util.Enumeration keys = UIManager.getDefaults().keys();
    while (keys.hasMoreElements()) {
      Object key = keys.nextElement();
      Object value = UIManager.get (key);
      if (value instanceof javax.swing.plaf.FontUIResource)
        UIManager.put (key, f);
      }
    } 

Вызов...

setUIFont (new javax.swing.plaf.FontUIResource("Serif",Font.ITALIC,12));

Ответ 2

UIManager.put("Button.font", /* font of your liking */);
UIManager.put("ToggleButton.font", /* font of your liking */);
UIManager.put("RadioButton.font", /* font of your liking */);
UIManager.put("CheckBox.font", /* font of your liking */);
UIManager.put("ColorChooser.font", /* font of your liking */);
UIManager.put("ComboBox.font", /* font of your liking */);
UIManager.put("Label.font", /* font of your liking */);
UIManager.put("List.font", /* font of your liking */);
UIManager.put("MenuBar.font", /* font of your liking */);
UIManager.put("MenuItem.font", /* font of your liking */);
UIManager.put("RadioButtonMenuItem.font", /* font of your liking */);
UIManager.put("CheckBoxMenuItem.font", /* font of your liking */);
UIManager.put("Menu.font", /* font of your liking */);
UIManager.put("PopupMenu.font", /* font of your liking */);
UIManager.put("OptionPane.font", /* font of your liking */);
UIManager.put("Panel.font", /* font of your liking */);
UIManager.put("ProgressBar.font", /* font of your liking */);
UIManager.put("ScrollPane.font", /* font of your liking */);
UIManager.put("Viewport.font", /* font of your liking */);
UIManager.put("TabbedPane.font", /* font of your liking */);
UIManager.put("Table.font", /* font of your liking */);
UIManager.put("TableHeader.font", /* font of your liking */);
UIManager.put("TextField.font", /* font of your liking */);
UIManager.put("PasswordField.font", /* font of your liking */);
UIManager.put("TextArea.font", /* font of your liking */);
UIManager.put("TextPane.font", /* font of your liking */);
UIManager.put("EditorPane.font", /* font of your liking */);
UIManager.put("TitledBorder.font", /* font of your liking */);
UIManager.put("ToolBar.font", /* font of your liking */);
UIManager.put("ToolTip.font", /* font of your liking */);
UIManager.put("Tree.font", /* font of your liking */);

Источник: http://www.jguru.com/faq/view.jsp?EID=340519

Ответ 3

java -Dswing.aatext=true -Dswing.plaf.metal.controlFont=Tahoma -Dswing.plaf.metal.userFont=Tahoma …

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

Ответ 4

Я думаю, что это лучше, называя его текущим laf вместо всего UIManager положите это

UIManager.getLookAndFeelDefaults()
        .put("defaultFont", new Font("Arial", Font.BOLD, 14));

Где-то в основном перед созданием объекта JFrame. Он отлично работал у меня. Помните, что это шрифт по умолчанию для компонентов, у которых нет указанного шрифта.

источник: http://www.java.net/node/680725

Ответ 5

Имейте в виду, что способ установки шрифта по умолчанию зависит от того, как вы выглядите. Решение, описанное Роменом Хиппоу, отлично работает с большим количеством ЛАФ, но не с нимбом. Тот, который отправил sherif, отлично работает с нимбом, но не с другими (например, Metal).

Объединение обоих может работать на большинстве LAF, но ни одно из этих решений не работает с GTK + LAF.

Я думаю (но я не уверен), нет кросс-платформенного решения.

Ответ 6

Вдохновленный Романом Хиппо, используйте этот код, если вы хотите установить только размер шрифта.

for (Map.Entry<Object, Object> entry : javax.swing.UIManager.getDefaults().entrySet()) {
    Object key = entry.getKey();
    Object value = javax.swing.UIManager.get(key);
    if (value != null && value instanceof javax.swing.plaf.FontUIResource) {
        javax.swing.plaf.FontUIResource fr=(javax.swing.plaf.FontUIResource)value;
        javax.swing.plaf.FontUIResource f = new javax.swing.plaf.FontUIResource(fr.getFamily(), fr.getStyle(), FONT_SIZE);
        javax.swing.UIManager.put(key, f);
    }
}

Ответ 7

Я использую Nimbus L & F.

Используя код из @Romain Hippeau, мне пришлось использовать UIManager.getLookAndFeelDefaults() вместо UIManager.getDefaults() и использовать возвращаемую ссылку на put измененные значения:

    int szIncr = 5; // Value to increase the size by
    UIDefaults uidef = UIManager.getLookAndFeelDefaults();
    for (Entry<Object,Object> e : uidef.entrySet()) {
        Object val = e.getValue();
        if (val != null && val instanceof FontUIResource) {
            FontUIResource fui = (FontUIResource)val;
            uidef.put(e.getKey(), new FontUIResource(fui.getName(), fui.getStyle(), fui.getSize()+szIncr));
        }
    }

По какой-то причине он, похоже, не работает с стандартным L & F... (на основании проведенных ограниченных тестов)

Ответ 8

Чтобы решить эту проблему, я просто реализую AWTEventListener и слушаю COMPONENT_ADDED из ContainerEvent.

Все описание сюжета: http://wiki.idempiere.org/en/Swing_Miss_Support_Some_Language

Весь код: https://bitbucket.org/hieplq/unicentapos/src/9b22875ab65e26ff46fd9ae62d556b7f64621afa/src-extend/vn/hsv/uitil/font/FontGlyphsUtil.java?at=tip

  • Внедрение AWTEventListener

 

public void eventDispatched(AWTEvent event) {
    if (!isMissSupportGlyph || !(event instanceof ComponentEvent) || !(event instanceof ContainerEvent))
        return;

    if (event instanceof ContainerEvent){
        ContainerEvent containerEvent = (ContainerEvent)event;
        if (containerEvent.getID() == ContainerEvent.COMPONENT_ADDED){
            updateChildControlFont(containerEvent.getChild());
        }
    }
}
  1. Добавить реестрщик (лучшее место для запуска при запуске программы)

 

Toolkit.getDefaultToolkit().addAWTEventListener(this, AWTEvent.COMPONENT_EVENT_MASK | AWTEvent.CONTAINER_EVENT_MASK);

Ответ 9

ни одно из этих решений не подходит для меня, я строю свой собственный (глупый), но он работает:

private void changeFontRecursive(Container root, Font font) {
    for (Component c : root.getComponents()) {
        c.setFont(font);
        if (c instanceof Container) {
            changeFontRecursive((Container) c, font);
        }
    }
}

Ответ 10

Правильный ответ - вопрос Амира Раминфара, но вы должны инкапсулировать шрифт FontUIResource. Например:

UIManager.put("Button.font", new FontUIResource(new Font ("Helvetica", Font.BOLD, 16)));

Ответ 11

Я использовал XML файл Synth look and feel и определил там шрифты. Легкий, гибкий и континентальный.
Вам нужно создать класс с createFont следующим образом:

public class CustomFontResource {
public static FontUIResource createFont(String path, final int size) throws IOException, FontFormatException {
    Font font = Font.createFont(Font.TRUETYPE_FONT, new FileInputStream(path));
    return new FontUIResource(font.deriveFont(Font.PLAIN, size));
}

И в вашем synth xml определите шрифт как:

    <object id="Basic_Regular" class="<your CustomFontResource class>"
        method="createFont">
    <string>path_to_your_font</string>
    <int>font_size</int>
</object>

то вы можете использовать его в качестве ссылки везде, где хотите в xml.