如何在JavaFX中设置字体的字母间距(也就是跟踪)?

时间:2015-05-13 16:39:58

标签: java javafx-2 javafx-8

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

2 个答案:

答案 0 :(得分:2)

我制作了一个符合我需求的自定义课程(警告:没有很多功能)

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);
            }
        }
    }
}

答案 1 :(得分:0)

我知道我参加聚会很晚,但是以防万一有人还在寻找答案:

我一直在开发一个小型的文本编辑器应用程序,该应用程序的核心业务功能之一是用户可以手动设置文本间距(也称为“跟踪”)。 在这种情况下,JavaFX非常不便-没有CSS可以处理它,您无法通过通用控制器的API对其进行设置,并且无法自定义使用的Font,因此它可能包含跟踪。

由于JavaFX无法做到,而且仍然需要使用它,因此存在将FX与其他库(例如Swing)混合的可能性。我使用SwingNode并将JTextField包裹在其中。 JTextField提供了setting Font from AWT的可能性。与JavaFX中使用的字体不同,AWT中的字体可以根据字母跟踪进行自定义。为此,请使用Font的attributes并根据您的需要设置TRACKING

请注意-有时将JavaFX与Swing结合使用可能会出现问题,即使有大量消息来源都指出了这一点。例如,我在应用程序中动态渲染给定的JTextField面临着巨大的问题。我执行了许多动画(主要与在用户空间周围拖动东西,快速更改字体细节等有关)。但是我想,只要您需要在静态位置输入内容,并且不会做太多动画,它就可以很好地工作。

顺便说一句。 JavaFX仍未解决此跟踪问题的事实令人感到遗憾。