当前位置: 首页 > 知识库问答 >
问题:

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

章烨烨
2023-03-14

我已经开始在JavaFX中开发一个应用程序,我运行了一个问题,我可以找到很少有用的信息:Linux中字符之间的间距非常不均匀。我说的不是不同字符的宽度,而是字符之间的空格。

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

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

关于这个问题还有另一个问题,但它还没有得到回答:为什么JavaFX在使用文本组件时增加了额外的字母间距?我如何修复它?

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

共有1个答案

袁弘化
2023-03-14

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

这不是JavaFX的问题,而是我的Linux系统上的配置问题。JavaFX需要子像素渲染来正确定位字形。我使用的是Manjaro,它是ArchLinux的衍生物。在Archlinux中,默认情况下禁用了子像素渲染,这与Microsoft覆盖的专利有关。

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

 类似资料:
  • 在控制台上获取以下第一行: 35026:1978749]CoreText注意:客户端请求的名称“.SFNS-Regular”,它将获得Times-Roman而不是预期的字体。所有系统UI字体访问都应通过适当的API,如CTFontCreateUIFontForLanguage()或[NSFont systemFontOfSize:]。2021 06月09日00:00:46.808 java[350

  • 问题内容: 我一直在尝试增强我用Java编写的GUI系统,以使用亚 像素抗锯齿功能,并且除两个剩余的 异常现象之外,都已经取得了成功。这是我的一个后续从几个星期的其他问题 之前。 第一个问题是将渲染提示KEY_ANTIALIASING设置为 VALUE_ANTIALIAS_ON会导致将KEY_TEXT_ANTIALIASING设置 为LCD(子像素)AA值时被忽略。谁能对此有所启发?目前,我 被迫

  • 我试图使用opengl在lwjgl显示器上显示自定义字体的文本。目前,我正在使用自定义位图字体类从png文件加载字体,并以与tileset相同的方式显示它们。它工作正常,但当我将文本绘制到屏幕上时,字符之间的间距完全不同,因为字母M比字母i宽得多,并且所有字符的宽度都不同。有没有办法检测每个字符的宽度?或者是否有任何特定于lwjgl字体的库?有一种方法可以使用slick2d来实现,但加载整个库只是

  • 字体渲染引擎的工作主要是字体文件操作和文字渲染,LCUI 将其抽象成了 LCUI_FontEngine 接口,使得 LCUI 的字体渲染引擎可被切换和扩展。 目前基于该接口实现的引擎有内置引擎和 FreeType 引擎,接下来我们再深入了解它们。 内置引擎 内置引擎是 LCUI 初始化的第一个引擎,它主要用于在无其它可用引擎的情况下加载预置的字体位图数据,以确保界面中的文字能够被渲染出来。 内置引

  • 设置行距 各个文字行之间的垂直间距称为行距。对于罗马文字,行距是从一行文字的基线到它的上一行文字的基线的距离。基线是一条看不见的直线,大部分文字都位于这条线的上面。可以在同一段落中应用一个以上的行距量;但是,文字行中的最大行距值决定该行的行距值。 注意:在使用横排亚洲文字时,您可以指定行距的度量方式(从基线到基线,或从某一行的顶部到下一行的顶部)。 行距为 6 点的 5 点文字(左图)和行距为 1

  • 安卓字体渲染器 原文:android font renderer 译文出自 : 开发技术前线 www.devtf.cn 译者:7heaven 校对者: 状态:翻译完成 任何一个有几年的客户端应用开发经验的开发者都会知道文本渲染有多复杂。至少我在2010年开始写libhwui(基于OpenGL的安卓2D绘制API)之前是这么认为的。在开始写libhwui后,我意识到如果试图用GPU来渲染文本会使文本