Textarea的透明背景在JavaFX 8

War*_*fen 15 java javafx javafx-8

由于我使用的是JavaFX 8,所以我textarea的所有内容都不适用transparency于相应的css中定义的内容.它在Java 7中运行良好,但对于JavaFX 8的候选版本,我不能像以前那样表现.

编辑:这个问题是关于JavaFX TextArea,而不是JTextArea.
-fx-background-color: rgba(53,89,119,0.2);对textarea没有任何影响,虽然它应该有一个0.2的alpha值,但它是不相干的......

这是一个已知问题吗?

mih*_*iho 25

TextArea由几个节点组成.要使背景透明,还需要更改子窗格的背景(TextArea,ScrollPane,ViewPort,Content).这可以通过CSS完成.

CSS示例:

.text-area {
    -fx-background-color: rgba(53,89,119,0.4);
}

.text-area .scroll-pane {
    -fx-background-color: transparent;
}

.text-area .scroll-pane .viewport{
    -fx-background-color: transparent;
}


.text-area .scroll-pane .content{
    -fx-background-color: transparent;
}
Run Code Online (Sandbox Code Playgroud)

通过代码可以实现同样的目的.代码不应用于生产.它只是用于演示节点结构.

代码示例(使所有背景完全透明):

    TextArea textArea = new TextArea("I have an ugly white background :-(");
    // we don't use lambdas to create the change listener since we use
    // the instance twice via 'this' (see *)
    textArea.skinProperty().addListener(new ChangeListener<Skin<?>>() {

        @Override
        public void changed(
          ObservableValue<? extends Skin<?>> ov, Skin<?> t, Skin<?> t1) {
            if (t1 != null && t1.getNode() instanceof Region) {
                Region r = (Region) t1.getNode();
                r.setBackground(Background.EMPTY);

                r.getChildrenUnmodifiable().stream().
                        filter(n -> n instanceof Region).
                        map(n -> (Region) n).
                        forEach(n -> n.setBackground(Background.EMPTY));

                r.getChildrenUnmodifiable().stream().
                        filter(n -> n instanceof Control).
                        map(n -> (Control) n).
                        forEach(c -> c.skinProperty().addListener(this)); // *
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)

进一步参考:JavaFX CSS文档