如何在JavaFX字体中强制开启抗锯齿?

40

在测试我的JavaFX 8应用程序的GUI时,我注意到一些标签没有显示反锯齿文本。经过一些搜索和努力,我发现正在发生一件非常烦人的事情。抗锯齿仅应用于字体大小大于80px的标签。以下是一个比较使用AA的JavaFX和Swing应用程序的示例:

enter image description here

示例代码:https://gist.github.com/anonymous/be60bb89181376ff12aa

是否有一种方法可以强制在所有字体大小中使用AA?这种情况也发生在您身上吗?我在JavaFX Jira上搜索了类似的错误,但迄今没有人抱怨过。也许我应该为此打开一个问题?

以下是一些可能有用的信息:

java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b70, mixed mode)
Windows 8.1 64 bits [Version 6.3.9600]

我已经在Jira上开了一个bug来处理这个问题。 - Fappaz
2个回答

57

默认情况下,JavaFX 8使用modena.css来设置LCD抗锯齿,但在某些情况下似乎无法平滑字体。当字体大小大于80像素时,AA技术会切换到灰度AA(出于性能原因)。因此,为了在任何大小下实现平滑边缘,应改用灰度AA

这可以通过JavaFX CSS来完成:

.text{
    -fx-font-smoothing-type: gray;
}

或系统参数:

-Dprism.lcdtext=false

或者在加载FXML之前设置系统属性:

System.setProperty("prism.lcdtext", "false");

感谢所有在Jira上回复的人!


2
我认为默认的文本平滑类型是“gray”(请参阅https://docs.oracle.com/javafx/2/api/javafx/scene/doc-files/cssref.html),但Modena CSS将其设置为“lcd”。 - Paolo Fulgoni
8
需要注意的是,如果用户界面是从FXML模板加载的,则应在加载之前调用 System.setProperty("prism.lcdtext", "false"); ,否则它将不起作用。请注意,不要改变原句意思,只需使翻译更加通俗易懂即可。 - Ivan Akulov

2

System.setProperty("prism.lcdtext", "false");

必须在加载FXML模板之前调用。


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