Подтвердить что ты не робот

Прозрачный фон текстового поля в JavaFX 8

Поскольку я использую JavaFX 8, все мои textarea не применяют transparency, которые были определены в соответствующем css. Он отлично работает в Java 7, но для кандидата на выпуск JavaFX 8 я не могу заставить его вести себя как раньше.

EDIT: Этот вопрос касается JavaFX TextArea, а не JTextArea.
-fx-background-color: rgba(53,89,119,0.2); больше не влияет на текстовое поле, хотя оно должно иметь значение альфа 0.2, но оно является opague...

Это известная проблема?

4b9b3361

Ответ 1

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

То же самое можно сделать с помощью кода. Код не должен использоваться для производства. Это просто для демонстрации структуры node.

Пример кода (делает все фоны полностью прозрачными):

    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