2

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

完成此操作后,我就像“好吧,我不会再经历这个了”所以我决定不使用系统外观并尝试 Nimbus。它在我测试过的平台上看起来不错,但 JLabel/JTextField 字体大小在多个平台上仍然无法正确显示,无论它们是否被指定(如 Sans Serif 12)。有没有一种方法可以使字体在所有平台上真正通用,并避免进行所有这些跨平台测试?

4

3 回答 3

3

您面临的问题是每个平台彼此独立。从内存中(现在又回到过去了),Java 以 72 dpi 呈现它的 UI(这可能最近发生了变化)。

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

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

最好的办法是仔细规划你的 UI 并巧妙地利用 Swings 内部指标,而不是直接设置大小。

于 2012-08-16T20:39:14.627 回答
2

您可以做的主要事情是使用特定的TrueType 字体并将其作为资源捆绑到您的应用程序中。通过这种方式,您可以获得字体在所有平台上显示相同的最佳机会。不能保证“无衬线”在所有平台上都是相同的——Java 只会使用最接近的可用匹配。

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

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

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

于 2012-08-17T00:27:19.260 回答
2

如此处所示,使用适当的布局管理器pack()允许组件利用其首选大小,而不管平台和字体如何。

图片

于 2012-08-17T00:57:06.533 回答