Мне было интересно, как установить шрифт по умолчанию для всей моей программы Java swing. Из моих исследований кажется, что это можно сделать с помощью UIManager
, что-то связанное с LookAndFeel
, но я не могу найти конкретно, как это сделать, а UIManager
выглядит довольно сложно.
Настройка программы Default Font of Swing
Ответ 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 */);
Ответ 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
- Внедрение 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());
}
}
}
- Добавить реестрщик (лучшее место для запуска при запуске программы)
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.