【问题标题】:how to make Java Swing Application has a consistent font in windows and linux?如何让Java Swing Application在windows和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

标签: java linux swing fonts windows-xp


【解决方案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 对相同的字体并不真正感兴趣,但对跨平台的合理布局感兴趣。
      猜你喜欢
      • 2016-07-27
      • 1970-01-01
      • 1970-01-01
      • 2018-03-16
      • 1970-01-01
      • 2013-03-17
      • 1970-01-01
      • 2012-01-15
      • 1970-01-01
      相关资源
      最近更新 更多