如何在 JavaFX 中设置字体的字母间距(又名跟踪)?

How to set the letter spacing (aka tracking) of a Font in JavaFX?

互联网告诉我它可以在 JavaFX 1.x 中使用(我发现的大多数示例都是 .fx 格式,现在已经过时了)。但现在(JavaFX 2.*)似乎不可能做到。 我可以想到一种方法来实现我想要的效果:将每个字母填充到 Text 中,然后将它们全部添加到 FlowPane 中,并将 HGap 设置为所需的间距。但我宁愿将此用作最后的手段。 哦,我也试过把 -fx-letter-spacing 放在我的样式表中,也没用。

我定制了一个符合我需要的 class(警告:功能不多)

public class LetterSpacedText extends FlowPane {
    private Font font;
    private Color fill;

    public LetterSpacedText(String s, double spacing) {
        setText(s);
        setHgap(spacing);
    }

    public void setText(String s) {
        getChildren().clear();
        for (int i = 0; i < s.length(); i++) {
            getChildren().add(new Text("" + s.charAt(i)));
        }
        setFont(this.font);
        setFill(this.fill);
    }

    public void setFont(Font font) {
        if (font != null) {
            this.font = font;
            for (Node t : getChildren()) {
                ((Text) t).setFont(font);
            }
        }
    }

    public void setFill(Color fill) {
        if(fill != null) {
            this.fill = fill;
            for (Node t : getChildren()) {
                ((Text) t).setFill(fill);
            }
        }
    }
}

我知道我参加聚会迟到了,但以防万一有人还在寻找答案:

我一直在开发一个小型文本编辑器应用程序,其中一项核心业务功能是用户可以手动设置文本间距(又名 "tracking")。 JavaFX 在这种情况下非常不方便 - 没有 CSS 可以处理它,你不能通过公共控制器的 API 设置它,也没有办法自定义使用的字体,所以它可能包括跟踪。

由于 JavaFX 不能做到这一点并且仍然需要使用它,因此有一些可能将 FX 与其他库(如 Swing)混合使用。我根据你的需要用了SwingNode and wrapped JTextField inside. JTextField offers possibility of setting Font from AWT. Fonts in AWT, unlike the ones used in JavaFX, can be customised in terms of letter tracking. To do so use Font's attributes and set TRACKING

小心 - 将 JavaFX 与 Swing 结合使用有时可能会出现问题,尽管许多来源另有说明。例如,在我的应用程序中动态呈现给定的 JTextField 时,我面临着巨大的问题。我执行了很多动画(主要与在用户周围拖动东西 space、快速更改字体细节等有关)。但我想只要你需要在静态位置输入并且你不会做太多动画,它应该能很好地工作。

顺便说一句。 JavaFX 仍然没有解决这个跟踪问题这一事实有点令人难过。