JavaFX CSS наследование стилей - PullRequest
2 голосов
/ 13 апреля 2020

Учитывая следующее:

.base_arc
{
  -fx-stroke: #000000;
}

.child_arc
{
  -fx-stroke-line-cap: BUTT;
}

Как я могу заставить .child_arc наследовать значение -fx-stroke, чтобы каждый, кто использует .child_arc, тоже получал значения в .base_arc? Я стараюсь не применять мои базовые стили вручную к каждому элементу, как это сделано здесь .

1 Ответ

3 голосов
/ 13 апреля 2020

Быстрый и простой ответ - комментарий Слава (который вообще не может использовать CSS наследование):

.base_arc, .child_arc { /* common styles */ } 
.child_arc { /* specific styles */ }

Более длинный ответ, обсуждающий CSS наследование и его связь с объектно-ориентированным наследованием ниже.

Фон CSS наследования против объектно-ориентированного наследования

CSS наследование не похоже на объект ориентированное наследование , которое имеет Java.

Вместо этого наследование CSS основано на положении узла в графе сцены . Дочерние узлы могут наследовать свойства CSS от своих родителей (если свойство CSS наследуемо). Наследование основано на положении в графе сцены, а не на иерархии типов классов Java. Это описано в JavaFX CSS документации по наследованию .

Применение CSS наследования к вашему примеру

Create CSS правила для родительского узла

Допустим, у вас есть Pane, в котором вы рисуете свои дуги, и вы устанавливаете стиль drawing-pane на нем. Если у вас есть следующее правило css:

.drawing-pane Arc { 
    -fx-stroke: black; 
}

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

Правило Arc - это селектор типа CSS , поэтому .drawing-pane Arc выберет любые дуги которые были нарисованы на панели рисования.

Создание CSS правил для определенных c типов дочерних узлов

Теперь, чтобы различать разные дуги, чтобы они имели разные стилей, вам нужно иметь дополнительное, более конкретное c, CSS правило, которое применяет указанный c стиль.

Итак, если вы создаете следующее правило:

.drawing-pane .child-arc {
    -fx-stroke-line-cap: BUTT;
}

, то все дуги, добавленные в область рисования, которым также назначен класс стилей child-arc, получат приклад. У них также будет черный штрих, поскольку к ним все еще применяется предыдущее правило drawing-pane Arc (через CSS наследование).

Свяжите ваши узлы с соответствующими CSS правилами

Существуют различные способы связать класс child-arc с ar c, например, с методом фабрики:

Arc createChildArc() {
    Arc arc = new Arc();
    arc.getStyleCass().add("child-arc");
}

Или с помощью наследования, установив стиль в конструкторе:

public class ChildArc extends Arc {
    public ChildArc() {
        getStyleClass().add("child-arc");
    }
}

Использование селекторов типа CSS вместо селекторов классов

Примечание: можно использовать селектор типа (без префикса . и относится к простой, не пакетный префикс Java имя класса), а не css селектор класса (использует префикс .), так что вы можете сделать:

public class ChildArc extends Arc {}

и иметь CSS как :

.drawing-pane ChildArc {
    -fx-stroke-line-cap: BUTT;
}

Но, как правило, классы стиля css, вероятно, немного более гибки и также более распространены, чем селекторы типов, так что я бы, вероятно, просто придерживался селекторов классов.


Я не совсем уверен, если это ответ Вы действительно хотели, но это мое понимание одного из способов решения проблемы, которая у вас есть.

Я думаю, что вы действительно ищете информацию о SASS, изложенную ниже, хотя, как правило, проблема не в том, как решить проблему при использовании прямого CSS без дополнительных инструментов.

Использование SASS для добавления объектно-ориентированного наследования к CSS

Если вы используете препроцессор, такой как SASS в таблицах стилей css, Вы можете добавить намного больше функций (из SASS) в свои таблицы стилей. Функции, которые поддерживает SASS, включают в себя дополнения и расширения для стилей CSS. Таким образом, SASS делает CSS более объектно-ориентированным в том, как он определяет свои правила стиля, позволяя объектно-ориентированному стилю наследовать информацию о стиле.

Хотите ли вы потратить время и взять на себя сложность в изучении SASS и внедрении его в цепочку сборки, решать только вам. Лично для себя я бы не использовал SASS, если бы не писал очень много CSS, чего я просто не делаю.

Стандартное значение по умолчанию css для JavaFX (модена. css), он большой, сложный и многофункциональный, и в его реализации не используются функции стиля SASS. Изучение модены. css - лучший способ изучить JavaFX CSS, лучшие практики и принципы использования. Если SASS не требуется для чего-то такого сложного, как modena. css, то вряд ли это будет действительно необходимо для таблиц стилей CSS, которые вы создаете для своего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...