【问题标题】:Using Java to develop cross-platform, fonts scaling differently on different platforms使用Java开发跨平台,字体在不同平台缩放不同
【发布时间】:2012-08-13 05:31:24
【问题描述】:

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

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

【问题讨论】:

  • 附带说明:如果您主要针对 Windows,我建议您坚持使用 System L&F。所有专业的 Swing 应用程序都试图看起来像 Windows 应用程序,而 L&F 的其余部分对大多数用户来说看起来很奇怪在 Windows 上。
  • 实际的外观设置并不那么重要。我只是希望它完全易于使用,而不必为不同的平台进行太多更改。该软件仅适用于约 20 人,因此我并没有具体的目标。然而,上面的问题很笼统,可以帮助我未来的跨平台开发。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      您能做的最好的事情是仔细规划您的 UI 并巧妙地利用 Swings 内部指标,而不是直接设置大小。

      【讨论】:

      • 这很不幸,但很现实。要求一种万能的解决方案来跨完全不同的解决方案运行单个应用程序是相当幼稚的,但是将 Java 吹捧为“跨平台”使得它看起来更合理。我想我最好的选择是为 OSX、Linux 和 Windows 开发独特的版本,或者只是添加一些简单的控制语句来根据当前使用的平台设置字体大小。我很乐观,所以我希望得到其他答案,尽管我几乎可以肯定你是正确的。谢谢
      • 我会选择第二个选项(基于 n 平台设置基本字体),您可以使用 UIManger 来实现这一点,但是,即使在同一平台上您也会遇到差异,看起来很棒在我家的 30 英寸屏幕上运行 120 dpi 之类的东西,在我工作时的 22 英寸/92 dpi 屏幕上看起来很糟糕;)
      猜你喜欢
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      • 2016-08-24
      • 1970-01-01
      • 2012-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多