JavaFX применяет эффект к фоновому изображению

Ситуация

Я использую BackgroundImage для установки фона для региона JavaFX, например:

region.setBackground(Background(BackgroundImage(Image(url)), BackgroundRepeat.NO_REPEAT, BackgroundRepeat.NO_REPEAT, BackgroundPosition.CENTER, BackgroundSize(100.0, 100.0, true, true, true, true))))

Проблема

Я хотел бы как-то затемнить фон, чтобы белый шрифт оставался читаемым.

Что я пробовал

Я искал изображение, фоновое изображение и фон, но ни у кого нет возможности добавить эффект. Я обнаружил, что могу добавить эффект непосредственно к региону, но когда я добавляю ColorAdjust, он затемняет все, а не только фон.

Мне действительно все равно, на каком слое он установлен, это может быть даже в CSS, я просто хочу как-то затемнить BackgroundImage.


person Xerus    schedule 17.06.2019    source источник
comment
Вы можете поместить Region в другой родитель (например, StackPane) вместе с другим вашим контентом. Поместите фоновое изображение на Region и примените к нему эффект.   -  person Slaw    schedule 17.06.2019
comment
Комментария Slaw достаточно, чтобы ответить на вопрос.   -  person jewelsea    schedule 18.06.2019


Ответы (1)


Когда вы применяете Effect к узлу, это влияет на все его дочерние элементы, если они есть. Вы также не можете применить Effect к Background, так как у него нет API для этого1. Вместо этого вы можете использовать отдельный Region для фонового изображения, а затем поместить его и другой контент в общий родительский элемент. Затем вы можете применить Effect к этой «фоновой области» и повлиять только на нее, а не на другие узлы. Родитель, который хорошо подойдет для этой ситуации, — это StackPane, так как он будет размещать ваш другой контент над «фоновой областью»; он также изменит размер области, чтобы заполнить все доступное пространство (что делает ее фактически фоновым изображением).

// Can also apply background through CSS or FXML. Same with the
// effect, though only DropShadow and InnerShadow can be set through
// CSS—any effect can be set though FXML.
Region backgroundRegion = new Region();
backgroundRegion.setBackground(new Background(new BackgroundImage(...)));
backgroundRegion.setEffect(new ColorAdjust(...));

Node otherContent = ...;

StackPane parent = new StackPane(backgroundRegion, otherContent);
// add "parent" to scene graph...

Примечание. Я бы использовал Region, как указано выше, а не ImageView, так как первый сохранит поведение фонового изображения; не так просто имитировать фоновое изображение с помощью ImageView (по крайней мере, по моему опыту).


1. Это относится к коду, CSS и FXML. Обратите внимание, что CSS и FXML – это просто альтернативные способы создания объекта Background.

person Slaw    schedule 17.06.2019