英文:
What's the proper way for a `BasicLookAndFeel` subclass to activate anti-aliasing in Java 11?
问题
I have this in-house Swing Look & Feel, and as is usual for a migration to Java 11, usages of SwingUtilities2
members are to be replaced by official APIs.
Most are solved, but I haven't found any working advice on how to handle anti-aliasing.
The Look & Feel (L&F) is built as a subclass of BasicLookAndFeel
, which has mechanisms for anti-aliasing. However, these mechanisms require activation through defaults.put(SwingUtilities2.AA_TEXT_PROPERTY_KEY, AATextInfo.getAATextInfo(SwingUtilities2.isLocalDisplay()));
, which replicates what other Swing L&Fs do to enable AA. Unfortunately, with Java 11, this API isn't accessible anymore.
I have tried adjusting RenderingHints
in various places, but the settings don't seem to take effect. While analyzing the situation using the debugger, I've discovered that BasicLookAndFeel
seems to be hardcoded to use AATextInfo
objects for passing hints, which I can't use if I maintain my own L&F.
So, what options do I have? Using a different base class might be possible, but it's a bit daunting.
(Note: @kleopatra has referred to anti-aliasing as a "story-without-happy-ending," but my concern is about utilizing the preconfigured hints and applying them correctly, rather than toggling AA on or off intentionally.)
英文:
I have this in-house Swing Look&Feel, and as is usual for a migration to Java 11, usages of SwingUtilities2
members are to be replaced by official APIs.
Most are solved, but I haven't found any working advice how to crack anti-aliasing.
The L&F is built as a subclass of BasicLookAndFeel
, which has mechanisms for anti-aliasing; however, these seem to require activation through defaults.put(SwingUtilities2.AA_TEXT_PROPERTY_KEY, AATextInfo.getAATextInfo(SwingUtilities2.isLocalDisplay()));
, which replicates what other Swing L&Fs are doing to enable AA, but with Java 11 this API isn't accessible anymore.
I have fiddled with setting RenderingHints
in many likely and even some unlikely places, to no avail; for some reason, the settings never gain traction.
I am almost done analyzing the situation using the debugger (breakpoint on the L&F's LabelUI.paint()
function and single-stepping through all the decisionmaking logic), but I found that BasicLookAndFeel
seems to be hardcoded to use AATextInfo
objects to pass hints, which I can't use if I maintain my own L&F.
So... what are my options?
I could probably use a different base class, but that's... scary.
(I know that @kleopatra has called anti-aliasing a "story-without-happy-ending", but this is about picking up the preconfigured hints and properly applying them, not about wilfully switching AA on or off.)
答案1
得分: 0
抗锯齿设置从外观中被JComponent.setUI()
获取。
在Java 8中,它执行UIManager.getDefaults().get(SwingUtilities2.AA_TEXT_PROPERTY_KEY)
。
在Java 9中,它执行UIManager.getDefaults().get(RenderingHints.KEY_TEXT_ANTIALIASING)
。
没有逐步过渡,因此您需要同时清理API并切换到较新的Java版本,而不是分开进行。
英文:
Anti-aliasing settings from the Look&Feel are picked up by JComponent.setUI()
.
In Java 8, it does UIManager.getDefaults().get(SwingUtilities2.AA_TEXT_PROPERTY_KEY)
.
In Java 9, it does UIManager.getDefaults().get(RenderingHints.KEY_TEXT_ANTIALIASING)
.
There is no gradual transition so that you can clean up the API in one step and transition to a newer Java in a separate step, you have to do both at the same time.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论