6

我已经开始在 JavaFX 中开发一个应用程序并且我遇到了一个问题,我几乎找不到关于以下方面的有用信息:Linux 中字符之间的间距非常不均匀。我不是在谈论不同字符的宽度,而是在谈论字符之间的空格。

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

字符间距不均匀

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

在此处输入图像描述

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

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

关于这个问题还有另一个问题,但尚未得到解答: 为什么 JavaFX 在使用 Text 组件时会在字母之间添加额外的间距,我该如何解决?

我已经能够在运行 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);
    }
}
4

2 回答 2

4

Jewelsea 建议我将我的问题放在openjfx-dex 邮件列表中。那边的人可以解释发生了什么

不是JavaFX 的问题,而是我的 Linux 系统上的配置问题。JavaFX 需要亚像素渲染来正确定位字形。我正在使用 Manjaro,它是 Archlinux 的衍生产品。在 Archlinux 中,亚像素渲染默认是禁用的,这与微软的专利有关。

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

于 2018-03-07T21:24:39.960 回答
3

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

于 2019-01-17T14:44:13.290 回答