【问题标题】:Change Swing font size from command line从命令行更改 Swing 字体大小
【发布时间】:2020-11-29 20:56:57
【问题描述】:

我正在使用一个 Swing 应用程序,它在我的计算机上显示的文本字体大小非常小。

有没有办法从命令行或使用某种配置文件(例如,swing.properties 文件)更改字体大小或某种 DPI 设置?

我无权访问源代码。


编辑:

自 Java 9 以来,小字体不再是问题。Swing has started to scale its GUI components depending on the screen resolution

【问题讨论】:

    标签: java swing


    【解决方案1】:

    没有用于更改 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);
                }
            }
        });
    

    在调用实际应用的main方法之前。

    但是,如果字体非常小,则可能已明确设置,因此更改默认值可能无济于事。

    【讨论】:

    • 包装主类是一个不错的技巧,我会试试看效果如何。
    【解决方案2】:

    我认为没有这样的选项,因为所有组件字体大小都是在外观 (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 } ) );
    

    每个组件的e.t.c。

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

    【讨论】:

    • 这似乎与 Ingo Kegel 的建议中的方法相同,但没有奏效。
    • @Lii 它仅适用于支持 UI 默认字体的 L&F。并且要知道你的 L&F 是否支持它们——你必须挖掘它的源代码......
    【解决方案3】:

    我尚未对其进行测试,但您可以尝试启动该应用程序。使用Java Web Start。它允许为沙盒应用程序指定 swing.useSystemFontSettingsswing.metalTheme 等属性。这样做可能会“覆盖”代码中设置的小字体。

    有关详细信息,请参阅JNLP file syntax

    【讨论】:

    • 感谢您的建议,但在这种情况下,这是值得付出的努力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 2013-02-22
    • 2011-04-23
    • 2017-04-01
    • 2013-02-03
    相关资源
    最近更新 更多