JavaFX字体渲染中的字符间距(字距调整)错误(在Linux中)

时间:2018-03-06 16:55:00

标签: java javafx kerning subpixel font-rendering

我已经开始在JavaFX中开发一个应用程序而且我遇到了一个问题,我发现很少有用的信息:Linux中字符之间的间距非常不均匀。我不是在谈论不同角色的宽度,而是在谈论角色之间的空间。

它在普通文本中可见,但以下示例比普通文本更好地说明了效果。看看第一行。前两个字符之间的空间小于第二个和第三个字符之间的空格。这也发生在第六和第七个角色之间以及其他几个角色:

Uneven spacing of characters

Swing没有这个问题,JavaFX在Windows中没有此问题,或者在该操作系统上几乎看不到。它似乎也不是Mac上的主要问题。为了比较,这里是Mac Retina MacBook Pro的一个示例输出,2014年中,运行OS X 10.12.6和Java 9.0.4:

enter image description here

有人知道这是否是JavaFX字体渲染引擎中的错误?如果是,是否有解决方法?

我真的开始怀疑我是否应该更改框架,因为在我看来这样糟糕的字体渲染是不可接受的。

关于这个问题还有另外一个问题,但尚未得到答复: Why does JavaFX add extra spacing between letters when using the Text component and how do I fix it?

我已经能够在运行Manjaro的两台不同Linux机器上以及运行Debian的虚拟机中使用以下代码重现此问题:

package de.localtoast.fonttest;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class FontTest extends Application {

    @Override
    public void start(Stage primaryStage) {
        VBox root = new VBox();
        Label label1 = new Label("0000000000000000000000");
        Label label2 = new Label("OOOOOOOOOOOOOOOOOOOOOO");
        Label label3 = new Label("oooooooooooooooooooooo");

        root.getChildren().add(label1);
        root.getChildren().add(label2);
        root.getChildren().add(label3);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Font Test");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

2 个答案:

答案 0 :(得分:4)

jewelsea建议我把我的问题放在openjfx-dex mailing列表上。 The guys over there could explain what's going on

是JavaFX的问题,但是我的Linux系统上存在配置问题。 JavaFX需要子像素渲染才能正确定位字形。我使用Manjaro,它是Archlinux的衍生物。在Archlinux中,子像素渲染为disabled by default,这与Microsoft所涵盖的专利有关。

在我的情况下,问题可以通过从AUR安装freetype2-ultimate5软件包来解决,虽然在wiki中提到的freetype2-cleartype软件包可能是更好的选择。但是由于另一个问题,后者目前还没有在我的系统上编译。

答案 1 :(得分:0)

添加-Dprism.lcdtext=false可能会有所帮助,至少在Linux上,它使用更干净的灰度来消除痛苦的彩色亚像素抗锯齿尝试。