如何在任意Java应用程序中启用抗锯齿?

52

许多Java应用程序默认不使用抗锯齿字体,尽管Swing可以提供这些字体。如何强制任意Java应用程序使用抗锯齿字体?(包括我正在运行的应用程序和我正在开发的应用程序)

4个回答

79
如果你可以访问源代码,你可以在主方法中执行此操作:

If you have access to the source, you can do this in the main method:

  // enable anti-aliased text:
  System.setProperty("awt.useSystemAAFontSettings","on");

或者,(如果您没有访问源代码的权限,或者这样更容易),您可以通过将上述系统属性直接添加到命令行中来将它们传递给 JVM:

或者,(如果您没有访问源代码的权限,或者这样更容易),您可以通过将上述系统属性直接添加到命令行中来将它们传递给 JVM:

-Dawt.useSystemAAFontSettings=on

这种方法不适用于 Substance 外观,你有什么想法吗? - Rodrigo Asensio
这对于 Graphics#paintString(String, int, int) 不起作用。 - Ky -
如果您正在使用图形API,这可能会有所帮助:http://docs.oracle.com/javase/tutorial/2d/text/renderinghints.html - rcreswick
9
awt.useSystemAAFontSettings设置为on表示使用抗锯齿但不使用子像素渲染,这在大多数情况下(使用液晶显示器时)是首选。 而应该使用lcd值。请参见http://wiki.netbeans.org/FaqFontRendering。 - Piotr Dobrogost
1
第一个设置是可用的,而第二个设置不需要使用。这是一个未记录的私有设置,已从JRE中删除。详见详情: https://bugs.java.com/bugdatabase/view_bug.do?bug_id=6391267 - clemep

9
在最新的Java 6/7版本中,Swing控件应自动遵守系统范围内的首选项。 (如果您在Windows操作系统上使用Windows L&F,则如果您全局启用了ClearType设置,则文本应该使用ClearType呈现。)因此,也许一个解决方案就是:启用本地外观和感觉?
在您开发的应用程序中,如果直接渲染自己的文本,则还需要执行类似以下操作(在调用Graphics.drawText或相关方法之前的某个时间点):
if (desktopHints == null) { 
    Toolkit tk = Toolkit.getDefaultToolkit(); 
    desktopHints = (Map) (tk.getDesktopProperty("awt.font.desktophints")); 
}
if (desktopHints != null) { 
    g2d.addRenderingHints(desktopHints); 
} 

参考: http://weblogs.java.net/blog/chet/archive/2007/01/font_hints_for.html

这篇文章讨论了字体渲染的问题。它解释了字形平滑和抗锯齿技术,并讨论了Subpixel渲染和字体hinting的工作原理。此外,它还指出了一些在Java应用程序中实现最佳字体显示的注意事项。

6

记录一下,在我的Windows 7机器上,

  • 如果我在代码中不使用此项设置,则会得到漂亮的ClearType亚像素渲染。
  • 但是如果我使用此项设置,则会得到传统的黑白抗锯齿效果,这种效果要丑得多。

因此,应该谨慎使用此代码。我猜想当所有Linux用户都更新到默认处理抗锯齿的OpenJDK版本时,这个设置可能就不再需要了。


7
尝试使用System.setProperty("awt.useSystemAAFontSettings", "lcd");,您应该会得到ClearType。 - Domchi
作为一名Linux和Windows用户,我不喜欢“ClearType”。我故意将其禁用。 - Wyatt Ward

0

感谢提供这些信息。我自己也在思考这个问题。 我使用SoapUI(www.eviware.com),默认情况下它不使用AA文本。我添加了-Dawt.useSystemAAFontSettings=on -Dswing.aatext=true到启动它的批处理文件中,但是没有任何改变。看来我得去他们的论坛问问了。


可能会将参数解释为应用程序相关而不是jvm相关--您可能需要更深入地挖掘bat文件。 (或者它可能无法适用于所有应用程序...如果是这样,请告诉我/投票否决我的答案..) - rcreswick
1
我通过编辑 .sh 启动文件,使最后一行为:java -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true -Dsoapui.properties=soapui.properties -Dgroovy.source.encoding=iso-8859-1 -cp $SOAPUI_CLASSPATH com.eviware.soapui.SoapUIPro $*,以使其正常工作。 - rcreswick
1
我相信你可以通过在JAVA_OPTS行中添加此处列出的-D....参数,或者只需指定JAVA_OPTS=-Dawt.useSystemAAFontSettings=on -Dswing.aatext=true来修改soapui批处理文件,从而实现同样的效果。 - rcreswick
在Windows上使用SoapUI时,我编辑了“C:\Program Files(x86)\SmartBear\SoapUI-5.0.0 \ bin”文件夹中的SoapUI-5.0.0.vmoptions文件,并添加了-Dawt.useSystemAAFontSettings = on -Dswing.aatext = true作为最后一行。 - Aidan
此外,参数的顺序可能会产生巨大的影响,您需要在任何“-jar mycooljar.jar”之前添加参数。 - bmurauer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接