Настройка встроенных стилей CSS имеет приоритет над стилями в CSS-файле. Так что применение фона через setStyle поможет.
button.setOnAction(event -> {
final Node node = titledPane.lookup(".title");
if (button.isSelected()) {
node.setStyle("-fx-background-color:#00ff11;");
} else {
node.setStyle(null);
}
});
UPDATE:
Тем не менее, немного больше деталей о актуальной проблеме. Чтобы понять это, вам нужно сначала узнать, как внутренне определяется фон .title и как устанавливается стиль наведения.
Внутри Modena.css ниже приведены стили для фона .title:
.titled-pane > .title {
-fx-background-color:
linear-gradient(to bottom,
derive(-fx-color,-15%) 95%,
derive(-fx-color,-25%) 100%
),
-fx-inner-border, -fx-body-color;
-fx-background-insets: 0, 1, 2;
-fx-background-radius: 3 3 0 0, 2 2 0 0, 1 1 0 0;
-fx-padding: 0.3333em 0.75em 0.3333em 0.75em; /* 4 9 4 9 */
}
.titled-pane > .title:hover {
-fx-color: -fx-hover-base;
}
Если вы заметили, что фактический фон получен из -fx-color, -fx-inner-border & -fx-body-color. Однако -fx-inner-border & -fx-body-color действительно снова получены только из -fx-color.
-fx-inner-border: linear-gradient(to bottom,
ladder(
-fx-color,
derive(-fx-color,30%) 0%,
derive(-fx-color,20%) 40%,
derive(-fx-color,25%) 60%,
derive(-fx-color,55%) 80%,
derive(-fx-color,55%) 90%,
derive(-fx-color,75%) 100%
),
ladder(
-fx-color,
derive(-fx-color,20%) 0%,
derive(-fx-color,10%) 20%,
derive(-fx-color,5%) 40%,
derive(-fx-color,-2%) 60%,
derive(-fx-color,-5%) 100%
));
-fx-body-color: linear-gradient(to bottom,
ladder(
-fx-color,
derive(-fx-color,8%) 75%,
derive(-fx-color,10%) 80%
),
derive(-fx-color,-8%));
В псевдо-состоянии: hover -fx-color изменяется на -fx-hover-base, и фон соответствующим образом обновляется. В этом и заключается ваша проблема . Вы устанавливаете только фон по умолчанию программно. При наведении указателя мыши на .title он по-прежнему выбирает внутренний стиль CSS-файла (поскольку вы не определили свой пользовательский для hover).
Если нам удастся обновить атрибут -fx-color, он позаботится о соответствующих обновлениях CSS для различных псевдо-состояний.
Более правильный подход для ваших требований будет следующим: таким образом вы все равно сможете получить хорошие градиентные функции заголовка, которые определены внутри.
button.setOnAction(event -> {
final Node node = titledPane.lookup(".title");
if (button.isSelected()) {
node.setStyle("-fx-color:#00ff11;");
} else {
node.setStyle(null);
}
});
// In css file
.titled-pane > .title {
-fx-color: -primary-border-color;
-fx-background-insets: 0;
-fx-background-radius: 0 0 0 0;
-fx-padding: 0.2em 0.2em 0.2em 0.2em;
}