使用命令行更改Swing字体大小

6
我正在使用一个Swing应用程序,在我的电脑上显示的字体大小非常小。是否有办法从命令行或某种配置文件(例如类似于“swing.properties”文件的东西)更改字体大小或DPI设置?我无法访问源代码。

编辑:

自Java 9起,小字体大小不再是问题,因为Swing已开始根据屏幕分辨率缩放其GUI组件

3个回答

2

没有命令行开关可以更改Swing的字体大小。您需要调用以下方法:

public static void adjustFontSize(int adjustment) {

    UIDefaults defaults = UIManager.getDefaults();
    List<Object> newDefaults = new ArrayList<Object>();
    Map<Object, Font> newFonts = new HashMap<Object, Font>();

    Enumeration<Object> en = defaults.keys();
    while (en.hasMoreElements()) {
        Object key = en.nextElement();
        Object value = defaults.get(key);
        if (value instanceof Font) {
            Font oldFont = (Font)value;
            Font newFont = newFonts.get(oldFont);
            if (newFont == null) {
                newFont = new Font(oldFont.getName(), oldFont.getStyle(), oldFont.getSize() + adjustment);
                newFonts.put(oldFont, newFont);
            }
            newDefaults.add(key);
            newDefaults.add(newFont);
        }
    }
    defaults.putDefaults(newDefaults.toArray());
}

adjustment 是应该添加到每个字体大小的点数。

如果您无法访问源代码,您可以编写自己的包装器主类,在其中调用。

    UIManager.addPropertyChangeListener(new PropertyChangeListener() {
        public void propertyChange(PropertyChangeEvent event) {
            if (event.getPropertyName().equals("lookAndFeel")) {
                adjustFontSize(5);
            }
        }
    });

在调用实际应用程序的主方法之前。

但是,如果字体大小非常小,则很可能已经被明确设置,因此更改默认值可能无法帮助。


包装器主类是一个不错的技巧,我会尝试一下看看效果如何。 - Lii

1

我认为没有这样的选项,因为所有组件字体大小都是在外观和感觉(L&F)默认值中定义的。一些 L&F 允许快速更改字体,而另一些则不允许。在大多数情况下,您应该能够通过更改 UI 默认值来更改字体大小:

UIManager.put ( "Button.font", new SwingLazyValue ( "javax.swing.plaf.FontUIResource", null, new Object[]{ fontName, fontStyle, fontSize } ) );
UIManager.put ( "Label.font", new SwingLazyValue ( "javax.swing.plaf.FontUIResource", null, new Object[]{ fontName, fontStyle, fontSize } ) );
UIManager.put ( "TextField.font", new SwingLazyValue ( "javax.swing.plaf.FontUIResource", null, new Object[]{ fontName, fontStyle, fontSize } ) );

每个组件等等。

我不确定这些值是否可以在不更改应用程序代码或至少在应用程序内部具有一些字体大小更改支持的情况下传递给应用程序。


这似乎是与Ingo Kegel的建议相同的方法,但并没有起作用。 - Lii
1
@Lii 它只能与支持UI默认字体的L&F一起使用。要知道你的L&F是否支持它们 - 你将不得不挖掘它的源代码... - Mikle Garin

1

我没有测试过,但你可以尝试使用Java Web Start来启动应用程序。它允许指定像swing.useSystemFontSettingsswing.metalTheme这样的属性,即使是在沙盒应用程序中也可以。任何一种操作都可能会“覆盖”代码中设置的小字体。

有关更多详细信息,请参见JNLP文件语法


谢谢您的建议,但在这种情况下,这需要太多的努力,不值得。 - Lii

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接