#css #javafx
Вопрос:
Я хотел бы создать иерархию узлов JavaFX, такую как:
Region parentRegion = new Region();
Circle circle = new Circle();
parentRegion.getChildren().add(circle);
Но я не хочу, чтобы дети родительского региона использовали таблицу стилей родителя.
Так, например, если у меня есть следующий CSS:
.green {
-fx-fill: green;
}
И у меня есть следующий код:
Region parentRegion = new Region();
parentRegion.getStylesheets().add(<my CSS path>);
Circle circle = new Circle();
circle.getStyleClass().add("green");
parentRegion.getChildren().add(circle);
Я бы хотел, чтобы Круг был черным, а не зеленым.
Возможно ли это?
Комментарии:
1. Нет; предполагаемое поведение-это именно то поведение, о котором вы говорите, что не хотите. Если вы хотите, чтобы стиль применялся только к родительскому узлу, вы можете сделать что-то вроде
.root.green { ... }
или#some-id.green { ... }
.2. Причина, по которой я спрашиваю, заключается в том, что я пишу библиотеку для преобразования содержимого SVG в изображение узла группы, и мне бы хотелось по умолчанию не получать стили родительского узла.
Ответ №1:
Вы можете поместить ребенка в SubScene
.
Подцены не наследуют стили CSS своих родительских узлов.
Пример
В примере есть два круга, один из которых находится в области корневой компоновки основной сцены, другой-в подстрочной области (со светло-голубым фоном), которая также находится в области корневой компоновки основной сцены.
Панель компоновки основной сцены (VBox) имеет стили, определенные таким образом, чтобы все дочерние круги наследовали зеленую заливку. Однако подцена предотвращает наследование стилей CSS, поэтому зеленым является только круг, которого нет в подцене.
цветные круги.css
.green {
-fx-fill: green;
}
Circle {
-fx-fill: inherit;
}
Обратите внимание, что по умолчанию -fx-fill
значения атрибутов CSS не наследуются дочерними узлами, поэтому дополнительное правило, согласно которому круги наследуют значение атрибута CSS для-fx-заполнения.
StyleInheritance.java
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.*;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
public class StyleInheritance extends Application {
public static final double R = 50;
@Override
public void start(Stage stage) {
Circle circleInMainScene = new Circle(R, R, R);
Circle circleInSubScene = new Circle(R, R, R);
SubScene subScene = new SubScene(
new Group(circleInSubScene),
circleInSubScene.getLayoutBounds().getWidth(),
circleInSubScene.getLayoutBounds().getHeight()
);
subScene.setFill(Color.LIGHTBLUE);
VBox layout = new VBox(10, circleInMainScene, subScene);
layout.setPadding(new Insets(10));
layout.getStyleClass().add("green");
Scene mainScene = new Scene(layout);
mainScene.getStylesheets().add(
StyleInheritance.class.getResource(
"colored-circles.css"
).toExternalForm()
);
stage.setScene(mainScene);
stage.show();
}
public static void main(String[] args) {
launch();
}
}
Вероятно, есть также какой-то способ выполнить то, что вы хотите, с помощью одних только правил CSS, а не с помощью подценки, но использование ПодЦенки, похоже, работает, и это то, что я придумал.