【问题标题】:Monospaced font isn't monospaced in Java等宽字体在 Java 中不是等宽字体
【发布时间】:2020-12-17 19:04:46
【问题描述】:

我想将Text 设置为等宽字体。最后我选择了GT Pressura Mono Regular Regular

但是,关于他的一些事情很奇怪。我发现文本不是等宽的,尽管字母宽度的差异很小。

我认为字体有问题,但我尝试了其他等宽字体(下载的和从 Windows 下载的),但宽度始终不匹配。问题是什么?我只对文本使用大写字母。

请帮忙。

谢谢

更新

我正在添加一个代码以便更好地说明。

import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.scene.text.TextBoundsType;
import javafx.stage.Stage;

public class MonospacedText extends javafx.application.Application {

    @Override
    public void start(Stage stage) {
        var textA = new Text("A");
        textA.setBoundsType(TextBoundsType.VISUAL);
        textA.setFont(new Font("Consolas", 100));
    
        var textB = new Text("B");
        textB.setBoundsType(TextBoundsType.VISUAL);
        textB.setFont(new Font("Consolas", 100));
    
        var textC = new Text("C");
        textC.setBoundsType(TextBoundsType.VISUAL);
        textC.setFont(new Font("Consolas", 100));
    
        var textD = new Text("D");
        textD.setBoundsType(TextBoundsType.VISUAL);
        textD.setFont(new Font("Consolas", 100));
    
        var textE = new Text("E");
        textE.setBoundsType(TextBoundsType.VISUAL);
        textE.setFont(new Font("Consolas", 100));
    
        var vbox = new VBox(textA, textB, textC, textD, textE);
        vbox.setAlignment(Pos.TOP_LEFT);
        stage.setScene(new Scene(vbox));
        stage.show();
    }

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

从图片中已经可以看出,字母的宽度不一样。此外,当我添加此代码时,它会打印不同的值。

System.out.println(textA.getLayoutBounds().getWidth());
System.out.println(textB.getLayoutBounds().getWidth());
System.out.println(textC.getLayoutBounds().getWidth());
System.out.println(textD.getLayoutBounds().getWidth());
System.out.println(textE.getLayoutBounds().getWidth());

// 54.00390625
// 41.89453125
// 44.091796875
// 46.09375
// 36.279296875

【问题讨论】:

  • 你如何确定文本不是等距的?
  • 我添加了一个显示它的代码。
  • “单间距”并不意味着所有单独的字形都具有相同的视觉宽度。这意味着,在布局时,一个字形的开头和下一个字形的开头之间的距离是恒定的。我相信如果你测量LOGICAL 边界,而不是VISUAL 边界,你会发现它们是恒定的,如果你将字符布置在单个文本中,每个字符将占据相同数量的水平空间(使用不同数量的非视觉空间来补偿每个字母的不同视觉边界)。
  • 好吧,我误会了。无论如何,请问有没有更简单的方法来获得VISUAL 的字母宽度?我的意思是,是否有可能以某种方式计算一个字母的VISUAL 宽度,这样我就不必分别找出每个字母的宽度?

标签: java javafx text fonts monospace


【解决方案1】:

这个问题很可能是因为找不到字体而发生的。

请在设置文本(或系统支持的一些常用字体)之前尝试运行以下调用。然后尝试使用您的字体系列。如果没有找到任何字体,Java 就无法找到已安装的字体。

System.out.println(Font.getFontNames("Consolas"));

以下内容适用于 Windows 10。

Label title = new Label("Testing");
title.setFont(Font.font("Consolas", FontWeight.THIN, 60));
title.setTextFill(Color.RED);

【讨论】:

  • 他写了这个[Consolas, Consolas Bold, Consolas Bold Italic, Consolas Italic] 我添加了代码,使其易于查看。
猜你喜欢
  • 2013-01-09
  • 1970-01-01
  • 2010-10-29
  • 2019-12-21
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
  • 2014-06-09
  • 1970-01-01
相关资源
最近更新 更多