如何让Java Swing Application在windows和linux中字体一致?

Posted

技术标签:

【中文标题】如何让Java Swing Application在windows和linux中字体一致?【英文标题】:how to make Java Swing Application has a consistent font in windows and linux? 【发布时间】:2012-08-25 12:41:14 【问题描述】:

我有一个在 Windows XP 中开发的 Java 7 Swing 应用程序。我使用跨平台外观:

UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());

当我在 linux (Fedora 12) 上运行它时。字体有点宽。因此,布局在某些地方发生了变化。

有没有办法让应用程序使用与 jre 相同但不是本地系统的字体或类似字体?然后我们可以让它的外观和感觉真的一样。

谢谢,

【问题讨论】:

为什么不让布局根据平台的字体指标调整组件? 是的。这就是为什么布局在某些地方发生了变化。如果我们相反,我猜有些文本/标签将无法正确显示。 您到底想达到什么目标?对我来说,听起来你的布局有错误,并试图用标准字体修复它——如果是这样或类似的,方法是错误的:修复布局:-) 我正在尝试让我沉重的 GUI 应用程序的按钮、标签、复选框……在 Linux 中仍然正确显示。 GUI 在 Windows XP 中看起来非常漂亮,但在 Linux 中则不然,即使在 crossPlatform 外观设置之上使用相同的字体。 重复:我怀疑问题出在布局,而不是字体...您可以考虑显示屏幕截图和 sscce 【参考方案1】:

尚不清楚这是字体问题还是布局问题。当然,sscce 将有助于说明您认为是什么问题。相比之下,example 说明了如何调整布局以适应不同平台上的默认字体系列。

当您使用cross-platform L&F 时,您可能希望关闭粗体字体,如here 所示。一些平台没有使用实际的粗体字体,而是从普通字体中派生出粗体样式,通常结果好坏参半。

【讨论】:

【参考方案2】:

这可能行不通,但是。您可以提供自己的字体,与应用程序捆绑并在运行时加载。

查看Load fonts out of JAR-file and create AWT font (works) and register iText font (does not work) 的示例(答案不太正确,但意图很好)或http://www.java2s.com/Code/Java/2D-Graphics-GUI/Loadfontfromttffile.htm

加载后,您可以遍历 UIManager 的属性,将名称中的所有键替换为您的字体名称中的“.font”。

你最终要面对的问题是操作系统渲染引擎的差异,包括 DPI 和字体渲染引擎的差异。

【讨论】:

【参考方案3】:

您可以查看UIManager。 Swing 使用这里的属性,例如Label.font,来获取默认字体。所以你可以这样做:

Font font = // create font
UIManager.put("Label.font", font)

确保在创建任何 组件之前更改这些,否则您将获得一些具有正确字体的组件,而另一些则没有。 Here's a program 将显示UIManager 中的默认属性。以.font 结尾的任何内容都是您要查找的内容。

另一种方法是创建一个实用程序类,该类将使用您自己的默认值创建组件:

public class MyComponents 

    public static final Font LABEL_FONT = // create font

    public static JLabel createLabel(String text) 
        JLabel label = new JLabel(text);
        label.setFont(LABEL_FONT);
        return label;
    

如果这是一个没有很多组件的新应用程序,我推荐第二种方法。如果它是一个旧的应用程序,到处都有大量的组件生成,第一种方法会更省时,但第二种方法可能会更好。

【讨论】:

我在 XP 和 linux 上运行 UIManagerDefaults 程序。对于默认字体,我得到了相同的打印结果。这意味着 Java 使用相同的字体类型,但对于相同的字体类型 Linux 和 XP 呈现不同,Linux 比 XP 宽一点。所以我必须在 linux 上使用不同的字体来确保文本/标签不会在 Linux 中占用更多空间?我的应用程序是一个沉重的 GUI 应用程序。这是一种痛苦。 很奇怪。也许某些字体设置在不同系统之间设置不同?尝试使用指令here 设置抗锯齿。您还可以尝试将 AA 设置设置为 lcd,如 comment 中关于同一问题的建议。 作为一般规则,您应该非常小心地创建任意字体(假设您在 //....和操作系统指南要求使用这些来衍生变化(主要是大小,而不是通常的样式)。 @kleopatra 同意。 Font.deriveFont 是创建字体的最佳方式,通常应该在组件上已经存在的字体上完成,即 Font font = UIManager.getFont("Label.font").deriveFont(...); 这取决于您的设计意图。如果您希望您的程序在所有平台上看起来一致,您不会使用它。如果您希望您的程序看起来与本机应用程序一致,那么您会这样做。 很公平 :-) 虽然我怀疑 OP 对相同的字体并不真正感兴趣,但对跨平台的合理布局感兴趣。

以上是关于如何让Java Swing Application在windows和linux中字体一致?的主要内容,如果未能解决你的问题,请参考以下文章

急求JAVA大神帮忙!!!如何在JAVA Swing中设置滚动条,并且让界面能够随滚动条移动?

用java编写的swing程序。如何在主界面中实现刷新的功能,就是让主界面的组件刷新

用java编写的swing程序。如何在主界面中实现刷新的功能,就是让主界面的组件刷新

如何在 Swing 应用程序中使用退出按钮?

Java swing 动画看起来很不稳定。如何让它看起来很专业?

java swing中如何自行丢失焦点?已知怎样获取没找到如何丢失!