设置Swing程序的默认字体

我想知道如何设置我的整个Java swing程序的默认字体。 从我的研究看来,它可以用UIManager完成,与LookAndFeel ,但是我找不到具体怎么做,而UIManager看起来相当复杂。

尝试:

 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)); 
 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

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

这不仅会在您的完整用户界面上设置Tahoma,而且会打开反锯齿function,立即使任何字体变得更漂亮。

我觉得这样比较好,把它叫做现在的laf,而不是整个UIManager把这个

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

在实例化JFrame对象之前,在主要的某处。 它对我来说是完美的。 记住这是缺省字体,对于没有指定字体的组件。

来源: http : //www.java.net/node/680725

请注意,设置默认字体的方式取决于您使用的外观和感觉。 Romain Hippeau所描述的解决scheme在很多LAF上运行良好,但与Nimbus无关。 sherif发布的一个与Nimbus正常工作,但不与其他人(如金属)。

两者结合可以在大多数LAF上运行,但是这些解决scheme都不能与GTK + LAF一起使用。

我想(但我不确定),没有跨平台的解决scheme。

受到Romain Hippeau的启发,如果您只想设置字体大小,请使用此代码。

 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); } } 

我正在使用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 …(根据我执行的有限testing)

为了解决这个问题,我只实现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

  1. 实现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. 添加registry侦听器(运行此程序的最佳位置是启动程序时)
 Toolkit.getDefaultToolkit().addAWTEventListener(this, AWTEvent.COMPONENT_EVENT_MASK | AWTEvent.CONTAINER_EVENT_MASK); 

这些解决scheme都没有为我工作的好,我build立自己的(愚蠢的),但它的工作原理:

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

Amir Raminfar的正确答案是,但是你必须封装FontUIResource的字体。 例如 :

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

我使用了Synth外观和感觉的 XML文件,并在那里定义了字体。 简单,灵活和大陆。
你需要用createFont创build一个类:

 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)); } 

并在你的合成器xml中定义字体如下:

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

那么你可以使用它作为参考,无论你想在XML中。