JavaFX 8中文本区域的透明背景

16
自从我开始使用JavaFX 8后,所有的textarea都没有应用对应css中定义好的transparency属性。虽然在Java 7中它正常工作,但是在JavaFX 8的候选版本中,我无法使其像以前一样运行。
编辑: 这个问题是关于JavaFX TextArea,而不是JTextArea。 -fx-background-color: rgba(53,89,119,0.2);不再对textarea产生任何影响,尽管它应该有一个0.2的alpha值,但它是不透明的...
这是否是已知的问题?

有人能给我一点提示吗? - WarWolfen
1个回答

27

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

同样的效果可以通过代码实现。该代码不应用于生产环境,只是为了展示节点结构。

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

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

更多参考信息: JavaFX CSS 文档


这是一个非常聪明的例子。 - jewelsea
谢谢,解决了。虽然我可以确认在JDK 1.7中没有这个也能工作! - WarWolfen
如果TextArea没有被选中,如何只对它执行相同的操作? - kerner1000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接