【问题标题】:What font in Swing looks the same in all OS?Swing 中的什么字体在所有操作系统中看起来都一样?
【发布时间】:2011-11-03 12:25:52
【问题描述】:

我在 Windows 7 下使用带有 JDK6 的 Netbeans 7.0 来设计我的 Java 应用程序的用户界面。我应用系统外观。但它在 Windows 中看起来像我想要的方式,但在 MacOS 中有所不同,更糟糕的是,它在 Linux 中的不同窗口管理器(LXDE、GNOME、KDE、XFCE)中看起来不同。

我所说的不同是指字体的外观和大小。在 Windows 中,如果一个标签看起来像“v 1.23”,它在其他操作系统中看起来像“v ...”,因为字体在那个操作系统中变得更大并且 JLabel 没有足够的位置来显示。这发生在几个地方。

我不想增加标签宽度。我希望标签在所有操作系统中的给定宽度上看起来都一样。默认情况下,Netbeans 在我的电脑上使用 Tahoma 11pt 字体。我认为它并非在所有操作系统中都可用,因此其他操作系统使用不同的字体。

Arial 是常用字体吗?

我应该手动将每个元素的字体更改为 Arial 吗?还是有其他选择?

【问题讨论】:

  • 简短的回答是您不能也不应该这样做。设计您的 UI,使其不会在字体(最重要的是 - 接下来您需要窗口保持在左上角?)或文本发生轻微变化时中断。想想 i18n 或只是一个有好主意的设计师。

标签: java swing user-interface netbeans


【解决方案1】:

Lucida Sans Regular 始终与 Java 捆绑在一起,但我认为它不会解决某些文本/标签格式不正确的问题。这也取决于用户的屏幕分辨率。

【讨论】:

    【解决方案2】:

    当涉及到窗口管理器时,它不仅仅是字体大小,例如 2 个控件之间的宽度在 gnome 和 KDE 中的处理方式不同。当涉及到在所有平台上使用相同的字体大小时,您可以使用Sans Serif 字体,这在我使用过的所有操作系统中都可用。

    它也会更好(如果您在要运行应用程序的操作系统中找不到衬线字体),您可以下载字体(来自GNU Free Fonts 的免费字体)。

    在设置字体大小和字体时,您为什么不尝试使用主题并在此处设置字体... 您可以使用UIManager.setLookAndFeel() 方法更改主题。 这是Look & Feel上的链接

    【讨论】:

    • Serif 不是字体。它是一个字体类别。当您告诉 Java 使用 Serif 时,它会在您的计算机上选择一种特定的 serif 字体。肯定会有不同的操作系统。
    • @Anantha Sharma 感谢您的回答。我打算使用 Nimbus 主题。
    【解决方案3】:

    改为使用layout managerlogical font family。这个example 和下面的Font 在(默认)BorderLayout 的中心添加了 24 点斜体衬线文本,以在不同的平台上实现令人愉悦的结果。

    ta.setFont(new Font("Serif", Font.ITALIC, 24));
    

    Mac OS X:

    Windows 7:

    Ubuntu Linux:

    【讨论】:

    • 遗憾的是,我刚刚注意到 Ubuntu 的“Serif”概念看起来令人不安的是“SansSerif”。 :-)
    • 如果您担心“Serif”字符串发生变化,Font.SERIF 也是一种选择。
    【解决方案4】:

    一个老问题,但我发现它是因为我正在寻找解决方案。 我的解决方案是:使用 DejaVu 字体。 Java 对话框字体在 Linux 和 Windows 中看起来不同,但 DejaVuSans 12 非常类似于 Linux 中的对话框字体,并且在 Windows 中看起来相同(至少在 Windows 8.1 中)。 我的代码:

    ...
    static Font dejaVuSans;
    static final String resPath = "<classpath>/resources/"; // no leading "/"
    ...
    public static void main(String[] args) {
        /* See:
         * https://stackoverflow.com/questions/7434845/setting-the-default-font-of-swing-program
         * https://stackoverflow.com/questions/8361947/how-to-get-getclass-getresource-from-a-static-context
         */
        dejaVuSans = null;
        Font f;
        try {
            InputStream istream = <ClassName>.class.getClassLoader().getResourceAsStream(
                resPath + "DejaVuSans.ttf");
            dejaVuSans = Font.createFont(Font.TRUETYPE_FONT, istream);
            f = dejaVuSans.deriveFont(Font.PLAIN, 12);
        } catch (Exception e) {
            System.err.println(e.getMessage());
            f = null;
        }
        if (f == null)
            f = new Font("Dialog", Font.PLAIN, 12);
        java.util.Enumeration keys = UIManager.getDefaults().keys();
        while (keys.hasMoreElements()) {
            Object key = keys.nextElement();
            Object value = UIManager.get (key);
            if (value != null && value instanceof javax.swing.plaf.FontUIResource)
                UIManager.put (key, f);
        }
        ...
    }
    

    当然,如果 DejaVuSans.ttf 没有嵌入到 jar 文件中,您可以在运行时导入它。见How do you import a font?

    【讨论】:

      猜你喜欢
      • 2018-01-14
      • 1970-01-01
      • 2012-11-26
      • 2021-12-04
      • 2013-06-22
      • 1970-01-01
      • 2017-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多