我已经开始用JavaFX开发一个应用程序,我在一个问题上运行过,我几乎找不到有用的信息: Linux中字符之间的间隔非常不均匀。我说的不是不同字符的宽度,而是字符之间的空格。
它在普通文本中是可见的,但下面的示例说明效果比普通文本更好。看一下第一排。前两个字符之间的空格小于第二个和第三个字符之间的空格。这也发生在第六和第七个字符与其他几个字符之间:

Swing没有这个问题,JavaFX在Windows中也没有这个问题,或者在那个操作系统上几乎看不见。这似乎也不是Mac上的一个主要问题。作为比较,下面是一个运行OSX10.12.6和Java9.0.4的Mac Pro,2014年年中的示例输出:

有人知道这是否是JavaFX字体呈现引擎中的一个bug吗?如果是的话,有解决办法吗?
我真的开始怀疑是否应该改变框架,因为在我看来,这种糟糕的字体呈现是不可接受的。
关于这个问题还有另外一个问题,但尚未得到解答:为什么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);
}
}发布于 2018-03-07 21:24:39
珠宝海建议我把我的问题放在openjfx-dex邮件的清单上。那边的人可以解释发生了什么
不是的问题,而是我的Linux系统上的一个配置问题。JavaFX需要亚像素渲染来正确定位象形文字。我用的是Manjaro,它是Archlinux的衍生产品。在Archlinux中,亚像素渲染是默认禁用,它与微软的专利有关。
在我的例子中,这个问题可以通过从AUR安装freetype2-ultimate5包来解决,尽管wiki中提到的freetype2-cleartype包可能是更好的选择。但后者目前没有在我的系统上编译,因为另一个问题。
发布于 2019-01-17 14:44:13
添加-Dprism.lcdtext=false可能会有所帮助,至少在Linux上,它通过使用灰度来消除令人痛苦的非彩色亚像素反走样的尝试,这样做更干净。
https://stackoverflow.com/questions/49136131
复制相似问题