关于java:Swing中的哪种字体在所有操作系统中看起来都一样?

What font in Swing looks the same in all OS?

我在Windows 7下将Netbeans 7.0与JDK6一起使用来设计Java应用程序的用户界面。 我应用系统外观。 但是它在Windows中看起来像我想要的样子,但在MacOS中却有所不同,甚至更糟,在Linux中的不同窗口管理器(LXDE,GNOME,KDE,XFCE)中看起来也不同。

所谓的不同,是指字体的外观及其大小。 在Windows中,如果标签看起来是" v 1.23",则在其他操作系统中看起来像" v ...",因为该操作系统中的字体变大,并且JLabel没有足够的显示位置。 这发生在几个地方。

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

Arial是常见字体吗?

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


而是使用布局管理器和逻辑字体系列。下面带有Font的示例将24点斜体衬线文本添加到(默认)BorderLayout的中心,以在不同的平台上获得令人满意的结果。

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

Mac OS X:

Mac

Windows 7的:

Windows

Ubuntu Linux:

Linux


当涉及到窗口管理器时,除了字体大小以外,还有很多其他功能,例如,两个控件之间的宽度在gnome和KDE中的处理方式有所不同。当归结为在所有平台上都可以使用Sans Serif字体时,在我使用过的所有OS中都可以使用该字体。

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

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
...
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文件中,则可以在运行时将其导入。请参阅如何导入字体?。


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