2012-06-22 2 views
7

Я пытаюсь создать свою линейную линию JavaFX, но не могу найти способ установить цвет для определенных серий. Я знаю, что я могу стиль с помощью CSS, но я не могу найти, как установить ID или CLASS в мою серию.Как установить определенный цвет в JavaFX XYChart.Series?

Может кто-нибудь дать мне ключ на:

  1. Как установить цвет linecharts?
  2. Как установить класс css в серию?

ответ

12

В общем, предпочтительный способ создания диаграмм без кода, используя только таблицы стилей CSS, как рекомендует jschoen. Кроме того, если требуется дополнительная настройка, вы можете использовать css-поиск из кода, чтобы выкопать узлы, созданные из последовательных данных, и применить различные дополнительные стили CSS.

Здесь представлена ​​информация о динамическом изменении JavaFX line chart style и sample program, чтобы получить ответ. В примере приложения все дополнительные стили CSS выполняются с помощью вызова setStyle из кода. Используя подобный метод поиска, вы можете получить доступ к узлам серии, чтобы применить соответствующий стиль styleclass, а не вызов setStyle.

+0

Просто хотел сказать, что у вас есть несколько хороших образцов программ на вашем счету git. Сегодня я наткнулся на них и потерял пару часов, просто просматривая их. Очень полезный ресурс. Благодарю. –

+1

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

4

Я нашел этот документ Oracle на Styling charts with CSS и на этой странице, прокрутите вниз до Setting Chart Colors за то, что вы специально искали.

Как установить цвет в линейные диаграммы?

Самый простой способ для этого следующий CSS сниппет:

.default-color0.chart-series-line { -fx-stroke: #e9967a; } 
.default-color1.chart-series-line { -fx-stroke: #f0e68c; } 
.default-color2.chart-series-line { -fx-stroke: #dda0dd; } 

К сожалению, это не будет работать по идентификатору или которые рядом, а порядок ряды размещаются на графике. Вы можете также установить стили линий, хотя, выполнив:

.chart-series-line {  
    -fx-stroke-width: 2px; 
    -fx-effect: null; 
} 

Как установить класс CSS в серии?

К сожалению, я не вижу способа сделать это. Было бы неплохо иметь возможность создавать правила CSS, основанные на свойстве имени XYChart.Series, но я не думаю, что это возможно.

+0

Спасибо, я думал об изменении цвета по умолчанию, но мне нужно будет отключить/включить ряд (пользователь будет иметь функциональные возможности, чтобы показать/скрыть серии). И таким образом это не лучший способ сделать это. – Yurish

+0

Это решение не меняет цвет серии в легенде. – RestInPeace

2

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

При создании серии, добавить ряд конкретного класса стиля:

 val s = new XYChart.Series[Number, Number]() //create a new series 
     s.setName(seriesName)       //set its name (display in legend) 
     s.getNode.getStyleClass.add("series-" + seriesName) //add specific style class 

Тогда внутри css -файла я делаю следующее, чтобы изменить цвет заливки «butterwings» серии:

.series-butterwings *.chart-series-area-fill{ 
    -fx-fill: #aab597; 
} 

Это работает, потому что узел для области серии находится ниже узла серии (который является группой в случае диаграммы области).

+0

Я пытался это сделать, но обнаружил, что моя программа зависает над вызовом 'add'. У кого-то был подобный опыт? Я делаю это от ScalaFx; не знаю, имеет ли это значение (хотя я вызываю собственные методы javafx, а не обертки). – Luciano

5

Как установить цвет в линейные диаграммы?

Вот простой способ AreaChart или LineChart

XYChart chart = new AreaChart(); 
Series series = new Series(); 
chart.getData().add(series); 

Node fill = series.getNode().lookup(".chart-series-area-fill"); // only for AreaChart 
Node line = series.getNode().lookup(".chart-series-area-line"); 

Color color = Color.RED; // or any other color 

String rgb = String.format("%d, %d, %d", 
     (int) (color.getRed() * 255), 
     (int) (color.getGreen() * 255), 
     (int) (color.getBlue() * 255)); 

fill.setStyle("-fx-fill: rgba(" + rgb + ", 0.15);"); 
line.setStyle("-fx-stroke: rgba(" + rgb + ", 1.0);"); 
+1

Я получаю нуль обратно на этих строках: series.getNode(). Lookup (". Chart-series-area-fill-fill"); series.getNode(). Lookup (". Chart-series-area-line"); Я использую диаграмму области. – LordScone

+1

Для LineChart попробуйте 'series.getNode(). Lookup (". Chart-series-line ");'. – Pygmalion

+1

Я хотел бы подчеркнуть, что 'series.getNode(). Lookup()' должен вызываться ** после ** добавления серии к диаграмме, иначе он возвращает null. –

Смежные вопросы