Java字体呈现

Java字体呈现,java,fonts,rendering,antialiasing,Java,Fonts,Rendering,Antialiasing,我一直在尝试增强我用Java编写的GUI系统,以使用亚像素抗锯齿,并且取得了成功,除了剩下的两个异常。这是我生命的延续 第一个问题是,将渲染提示KEY\u ANTIALIAS设置为VALUE\u ANTIALIAS\u ON会导致KEY\u TEXT\u ANTIALIAS在设置为LCD(子像素)AA值时被忽略。有人能解释一下吗?目前,我被迫在渲染文本之前关闭VALUE\u ANTIALIAS\u,并在渲染文本之后将其重新打开(这样其他绘画,如圆形等,都会被禁用)。下面的自包含测试程序证明了此问

我一直在尝试增强我用Java编写的GUI系统,以使用亚像素抗锯齿,并且取得了成功,除了剩下的两个异常。这是我生命的延续

第一个问题是,将渲染提示
KEY\u ANTIALIAS
设置为
VALUE\u ANTIALIAS\u ON
会导致
KEY\u TEXT\u ANTIALIAS
在设置为LCD(子像素)AA值时被忽略。有人能解释一下吗?目前,我被迫在渲染文本之前关闭
VALUE\u ANTIALIAS\u
,并在渲染文本之后将其重新打开(这样其他绘画,如圆形等,都会被禁用)。下面的自包含测试程序证明了此问题

第二个问题是,我无法查询AA的底层O/S设置,因此我必须做一个相当困难的解决方法,即创建Swing
JLabel
,获取它的
FontMetrics
,获取它的
FontRenderContext
,然后从中获取AA提示。除了将Swing包含在一个完全不使用Swing的程序中之外,它不会在运行任何J2ME JVM的设备上工作。有人能提出更好的方法吗?如果它需要J5或J6就可以了,因为当前的混乱已经需要J6(但最好只需要J4)。我已经尝试了所有默认设置,并使用AWT组件而不是
JLabel


测试程序 该程序验证,要使亚像素AA工作,必须首先禁用常规AA设置。(注:我写回一个缓冲区,因为我的底层GUI需要,我想在一个等价的上下文中进行测试)

别忘了:“实现可以完全忽略问题。”作为参考,以下是我在24点上看到的内容:

有什么帮助吗?特别是“awt.font.desktophints”-它们包含本机组件使用的AA提示,但可以应用于任何需要的图形2D

最近读了《肮脏的富客户》中的AA部分,这只是一个偶然的机会

Use的外观如下所示:

String str = "A quick brown fox jumps over the lazy dog";
Toolkit tk = Toolkit.getDefaultToolkit();
Map desktopHints = (Map)(tk.getDesktopProperty("awt.font.desktophints"));
Graphics2D g2d = (Graphics2D)g;

if(desktopHints != null) {
    g2d.addRenderingHints(desktopHints);
}

g2d.drawString(str, someX, someY);
我能够得到与LCD HRGB模式相同的结果(使用示例类、drawChars和drawImage,为了简单起见只需键入drawString),使用这些提示,在我的机器上没有其他调用


我不确定这需要什么版本的Java,如果它是您想要的…

是的,我知道;在Mac电脑的情况下,无论提示如何,它都会呈现出美丽的效果。我只是想说服Java在运行“其他”O/S时尽其所能做到最好。。。明天将看一看。升级和接受-在J6中工作出色,在J5和更早版本中很好地退化到标准AA。没有更多的创造假摇摆标签-非常感谢。我猜这个故事的寓意是,我们仍然需要阅读尽可能多的教程,我们可以腾出时间。
String str = "A quick brown fox jumps over the lazy dog";
Toolkit tk = Toolkit.getDefaultToolkit();
Map desktopHints = (Map)(tk.getDesktopProperty("awt.font.desktophints"));
Graphics2D g2d = (Graphics2D)g;

if(desktopHints != null) {
    g2d.addRenderingHints(desktopHints);
}

g2d.drawString(str, someX, someY);