Swing中的哪个字体在所有操作系统中看起来都一样?

我在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吗? 还是其他任何选择?

对于窗口管理器而言,除了字体大小之外还有很多其他内容,例如,在gnome和KDE中,两个控件之间的宽度处理方式不同。 当它归结为在所有平台上使用相同的字体大小时,您可以使用Sans Serif字体,这在我使用的所有操作系统中都可用。

它也会更好(如果你在运行你的应用程序的操作系统中找不到serif)你可以下载一个字体(从GNU免费字体免费 )。

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

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

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

Mac OS X:

苹果电脑

Windows 7的:

视窗

Ubuntu Linux:

Linux的

Lucida Sans Regular总是与Java捆绑在一起,但我认为它不会解决某些文本/标签超出格式的问题。 这还取决于用户的屏幕结果。

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

 ... static Font dejaVuSans; static final String resPath = "/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 = .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文件中,您可以在运行时导入它。 请参阅如何导入字体? 。