为所有组件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); } } }