web-dev-qa-db-ja.com

JavaFX 8のテキストエリアの透明な背景

私はJavaFX 8を使用しているため、すべてのtextareasは、対応するcssで定義されているtransparencyを適用しません。 Java 7では正常に動作しますが、JavaFX 8のリリース候補では、以前のように動作させることができません。

編集:この質問は、JTextAreaではなく、JavaFX TextAreaに関するものです。
-fx-background-color: rgba(53,89,119,0.2);は、0.2のアルファ値を持っているはずですが、textareaには何の影響もありませんが、不透明です...

これは既知の問題ですか?

16
WarWolfen

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ドキュメント

25
miho