JavaFX применяет эффект к BackgroundImage - PullRequest
2 голосов
/ 17 июня 2019

Положение

Я использую 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.

1 Ответ

1 голос
/ 18 июня 2019

Когда вы применяете 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.

...