Пользовательский селектор java fx на графиках

У меня есть несколько StackedBarChart, содержащих различные серии.

StackedBarChart.Series<String, Number> series1= new StackedBarChart.Series<String, Number>(
                FXCollections.observableArrayList(list1));
StackedBarChart.Series<String, Number> series2= new StackedBarChart.Series<String, Number>(
                FXCollections.observableArrayList(list2));
StackedBarChart.Series<String, Number> series3= new StackedBarChart.Series<String, Number>(
                FXCollections.observableArrayList(list3));
ObservableList<StackedBarChart.Series<String, Number>> barChartData = FXCollections
                .observableArrayList(series1, series2,
                        series3);
        final StackedBarChart<String, Number> chart = new StackedBarChart<String, Number>(
                xAxis, yAxis, barChartData);

Я хотел бы изменить цвета серии по умолчанию. Поэтому я добавил пользовательскую таблицу стилей CSS

chart.getStylesheets().add("path to the CSS file");

В файле CSS я могу переопределить цвет по умолчанию с помощью чего-то вроде

.default-color0 {
    -fx-bar-fill: limegreen;
}
.default-color1 {
    -fx-bar-fill: orange;
}
.default-color2 {
    -fx-bar-fill: tomato;
}

Это работает отлично, но только заменяет цвета по умолчанию моими цветами. Если я изменю порядки серий при добавлении их на график, они поменяют свои цвета.

Я хотел бы быть более точным в своем CSS с чем-то вроде

.series1.color {
    -fx-bar-fill: limegreen;
}
.series2.color {
    -fx-bar-fill: orange;
}
.series2.color {
    -fx-bar-fill: tomato;
}

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

Я также знаю о методе lookup, но я нахожу его совсем не элегантным, так как вы должны вызывать его после того, как диаграмма была визуализирована (и поэтому вы можете видеть, как цвета очень быстро мигают между исходными цветами и новыми).

Итак, мой вопрос: как я могу определить селекторы CSS, например

.series1.color {
    -fx-bar-fill: limegreen;
}
.series2.color {
    -fx-bar-fill: orange;
}
.series2.color {
    -fx-bar-fill: tomato;
}

и применить их программно к серии диаграмм, которую я хочу

series1.applySelector(".series1.color");

так что даже если серии будут вставлены с другим порядком в диаграмму, они все равно получат нужный мне цвет


person facewindu    schedule 13.12.2013    source источник
comment
В чем вопрос?   -  person Math    schedule 13.12.2013
comment
Я добавил это, вы правы, это было непонятно :)   -  person facewindu    schedule 13.12.2013


Ответы (1)


Вы можете установить стиль прямо в компоненте, не редактируя CSS:

series1.getNode().setStyle("-fx-bar-fill: limegreen;");
series2.getNode().setStyle("-fx-bar-fill: orange;");
series3.getNode().setStyle("-fx-bar-fill: tomato;");

Или вы можете определить идентификатор в CSS и установить идентификатор CSS для компонента Java:

CSS

#clr1 {
    -fx-bar-fill: limegreen;    
}
#clr2 {
    -fx-bar-fill: orange;   
}
#clr3 {
    -fx-bar-fill: tomato;   
}

Ява

series1.getNode().setId("clr1");
series2.getNode().setId("clr2");
series3.getNode().setId("clr3");
person Math    schedule 13.12.2013
comment
Нет, я не могу. В серии нет методов setStyle или setId. И если я попробую серию1.getNode(). чтобы получить методы setSyle() или setId(), я получаю исключение нулевого указателя, потому что узел на самом деле еще не существует (я думаю) - person facewindu; 13.12.2013
comment
Ну ты мне помог. метод getNode() возвращает правильный узел после добавления серии на диаграмму. Так что мне удалось применить идентификатор с setId к серии. Спасибо - person facewindu; 13.12.2013
comment
Не за что, для регистрации я отредактирую свой ответ. - person Math; 13.12.2013