将文本放在JavaFX节点的后台

时间:2014-01-12 17:37:34

标签: javafx javafx-8

This stackoverflow answer解释了如何将背景图像放在TextField中。但是,我想知道如何将任意文本作为背景,如果可能的话,不使用CSS就可以。我的第一个想法是拍摄Text节点的快照并将其用作背景图像,如下所示(我在扩展TextField的类的构造函数中执行此操作):

Text text = new Text("TEST");
text.setFill(Color.RED);
WritableImage image = text.snapshot(new SnapshotParameters(), null);
this.setBackground(new Background(
        new BackgroundImage(
                image,
                BackgroundRepeat.NO_REPEAT,
                BackgroundRepeat.NO_REPEAT,
                new BackgroundPosition(Side.LEFT, 3D, false, Side.TOP, 50, true),
                new BackgroundSize(image.getWidth(), image.getHeight(), false, false, false, false))));

但是,它不起作用。背景完全变灰,甚至边框消失。知道怎么做吗? CSS解决方案也是可以接受的。

1 个答案:

答案 0 :(得分:0)

我明白了。有时将问题放在这里会有所帮助,它会让你思考。 : - )

有三个问题。首先,我必须使用现有的背景作为新背景的基础。其次,我错误地使用垂直位置,我想如果你把它设置为50%,它会将它垂直居中,但显然不是。最后,你不能在构造函数中执行此操作,因为后台尚不存在,所以我不得不将它包装在Platform.runLater()中。这是修改后的代码。

Platform.runLater(new Runnable() {
    @Override
    public void run() {
        Text text = new Text("TEST");
        text.setFill(Color.RED);
        WritableImage image = text.snapshot(new SnapshotParameters(), null);
        double imageVPos = (getHeight() - image.getHeight()) / 2;
        BackgroundImage backImage = new BackgroundImage(
                image,
                BackgroundRepeat.NO_REPEAT,
                BackgroundRepeat.NO_REPEAT,
                new BackgroundPosition(Side.LEFT, 7D, false, Side.TOP, imageVPos, false),
                new BackgroundSize(image.getWidth(), image.getHeight(), false, false, false, false));
        List<BackgroundImage> images = new ArrayList<BackgroundImage>();
        images.add(backImage);
        setBackground(new Background(getBackground().getFills(), images));
    }
});