为所有组件Java设置相同的字体

我想为JPanel所有组件设置一个特定的字体,但我更喜欢这个问题仍然更加通用,而不仅限于JPanel。 如何将字体设置为容器中的组件列表(JFrame或JPanel)?

这是一个简单的方法,允许您将Font指定给任何Container下的整个组件树(或者只是一个简单的Component,无所谓):

 public static void changeFont ( Component component, Font font ) { component.setFont ( font ); if ( component instanceof Container ) { for ( Component child : ( ( Container ) component ).getComponents () ) { changeFont ( child, font ); } } } 

只需将您的面板和特定字体传递给此方法,您就可以重构所有孩子。

您可以使用UIManager执行此操作….

例如:

 public class FrameTest { public static void setUIFont(FontUIResource f) { Enumeration keys = UIManager.getDefaults().keys(); while (keys.hasMoreElements()) { Object key = keys.nextElement(); Object value = UIManager.get(key); if (value instanceof FontUIResource) { FontUIResource orig = (FontUIResource) value; Font font = new Font(f.getFontName(), orig.getStyle(), f.getSize()); UIManager.put(key, new FontUIResource(font)); } } } public static void main(String[] args) throws InterruptedException { setUIFont(new FontUIResource(new Font("Arial", 0, 20))); JFrame f = new JFrame("Demo"); f.getContentPane().setLayout(new BorderLayout()); JPanel p = new JPanel(); p.add(new JLabel("hello")); p.setBorder(BorderFactory.createTitledBorder("Test Title")); f.add(p); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setSize(300, 300); f.setVisible(true); } } 

UIManager为要更改的组件设置字体值。 例如,您可以通过执行以下操作来设置用于标签的字体:

 Font labelFont = ... ; UIManager.put("Label.font", labelFont); 

请注意,不同的外观(L&F)可能具有UIManager类的不同属性,因此如果您从一个L&F切换到另一个L&F,则可能会出现问题。

灵感来自Mikle Grains答案我使用他的代码通过获取旧的fontsize来增加每个组件的字体百分比

  public static void changeFont(Component component, int fontSize) { Font f = component.getFont(); component.setFont(new Font(f.getName(),f.getStyle(),f.getSize() + fontSize)); if (component instanceof Container) { for (Component child : ((Container) component).getComponents()) { changeFont(child, fontSize); } } }