使用Java开发跨平台,字体在不同平台上的扩展方式不同

时间:2012-08-16 19:48:20

标签: java swing cross-platform look-and-feel font-size

我正在为我的大学制作一些软件。需要GUI。在它的第一个版本中,我让它使用系统外观(因此它看起来像Linux / Mac / Windows中的本机应用程序)。我发现这很麻烦,因为我不得不根据操作系统使所有JLabel的大小不同(无论分辨率/像素密度等)。

在这样做之后,我就像“好吧,我不会再次使用它了”所以我决定不使用系统的外观和感觉并尝试使用Nimbus。它在我测试的平台上看起来不错,但JLabel / JTextField字体大小仍然无法在多个平台上正确显示,无论它们是否被指定(如Sans Serif 12)。有没有办法让Font在所有平台上真正具有通用性,避免进行所有这些跨平台测试?

3 个答案:

答案 0 :(得分:3)

您面临的问题是每个平台彼此独立。从内存(现在回到现在),Java以72 dpi呈现它的UI(最近可能已经改变了)。

您永远不会从一个平台到另一个平台获得相同的结果。这归结为各个平台DPI设置的差异。

这也是为什么网页从平台到平台看起来不同以及为什么许多应用程序看起来略有不同的原因。

您可以做的最好是仔细规划用户界面并巧妙地使用Swings内部指标,而不是直接设置尺寸。

答案 1 :(得分:2)

您可以做的主要是使用特定 TrueType字体,将其捆绑为应用程序中的资源。这样您就可以在所有平台上获得相同字体的最佳机会。并不能保证“sans serif”在所有平台上都是一样的 - Java只会使用最接近的匹配。

然后,您可以在运行时从.jar加载字体,例如:

InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(filename)
Font font = Font.createFont(Font.TRUETYPE_FONT, is);

作为辅助点,总是值得设计您的应用布局,以便在字体大小上有合理的灵活性。也许您只需要为JLabel腾出更多空间,或者在某些地方进行文字换行等。

答案 2 :(得分:2)

如图here所示,使用适当的layout managerpack()将允许组件利用其首选大小,无论平台和字体如何。

image