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

标签 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 字体渲染引擎中的错误?如果是这样,是否有解决方法?

我真的开始怀疑我是否应该更改框架,因为在我看来,这种糟糕的字体渲染是 Not Acceptable 。

关于此问题还有另一个问题,但尚未得到解答: 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);
    }
}

最佳答案

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 包可能是更好的选择。但由于另一个问题,后一个目前无法在我的系统上编译。

关于java - JavaFX 字体渲染中的错误字符间距(字距调整)(在 Linux 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49136131/

相关文章:

JavaFX DoubleProperty intValue() 方法始终返回 0,其中返回 0....100

java - 如何运行多个 JavaFX 测试?

ios - 使用从 HTML 构建的 NSAttributedString 时在 iOS7/8 UITextView 中进行字距调整

css - DIN 字体 Web 字距调整问题

java - 从具有格式的 Excel 文件中获取单元格值

java - 在类路径中包含 jar 文件

JavaFX 剪贴板使图像变形。 DPI 难辞其咎?

java - 您如何模拟 JavaFX 工具包初始化?

php - 如何正确实现字距调整生成的代码

java - Spark : reduce causes StackOverflowError