【问题标题】:What's the proper way for a `BasicLookAndFeel` subclass to activate anti-aliasing in Java 11?`BasicLookAndFeel` 子类在 Java 11 中激活抗锯齿的正确方法是什么?
【发布时间】:2020-08-14 11:45:34
【问题描述】:

我有这个内部 Swing Look&Feel,并且像往常一样迁移到 Java 11,SwingUtilities2 成员的用法将被官方 API 取代。

大多数都已解决,但我还没有找到任何有效的建议来破解抗锯齿。

L&F 是BasicLookAndFeel 的子类,具有抗锯齿机制;但是,这些似乎需要通过defaults.put(SwingUtilities2.AA_TEXT_PROPERTY_KEY, AATextInfo.getAATextInfo(SwingUtilities2.isLocalDisplay())); 激活,这复制了其他 Swing L&F 正在执行的启用 AA 的操作,但在 Java 11 中,此 API 不再可用。
我在许多可能甚至一些不太可能的地方摆弄了RenderingHints,但无济于事;出于某种原因,这些设置从未受到关注。

我几乎完成了使用调试器分析情况(L&F 的 LabelUI.paint() 函数上的断点并单步执行所有决策逻辑),但我发现 BasicLookAndFeel 似乎被硬编码为使用 AATextInfo 对象传递提示,如果我维护自己的 L&F,我将无法使用这些提示。

那么...我有什么选择?
我可能可以使用不同的基类,但这……太可怕了。

(我知道@kleopatra 将抗锯齿称为“没有快乐结局的故事”,但这是关于获取预配置的提示并正确应用它们,而不是故意打开或关闭 AA。)

【问题讨论】:

  • 我一直认为启用抗锯齿的常用方法是-Dawt.useSystemAAFontSettings=on,那么this呢?
  • @a_horse_with_no_name 链接的问题是关于打开和关闭现有 L&F 的抗锯齿功能。这个问题是关于以这样的设置实际工作的方式实施 L&F。
  • 好吧,如果你的 L&F 完成了所有的绘画,那么关于渲染提示的 answer 应该会有所帮助。如果您的 L&F 不自己绘制,全局设置应该会有所帮助。
  • @a_horse_with_no_name 啊。我不小心删掉了 L&F 是“BasicLookAndFeel”的子类,并尝试尽可能多地重用该实现。

标签: java swing look-and-feel


【解决方案1】:

外观和感觉中的抗锯齿设置由JComponent.setUI() 获取。
在 Java 8 中,它是 UIManager.getDefaults().get(SwingUtilities2.AA_TEXT_PROPERTY_KEY)
在 Java 9 中,它是 UIManager.getDefaults().get(RenderingHints.KEY_TEXT_ANTIALIASING)

没有逐步过渡,因此您可以在一个步骤中清理 API 并在单独的步骤中过渡到较新的 Java,您必须同时进行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    相关资源
    最近更新 更多