2013-09-22 13 views
0

У меня есть приложение JavaFX, которое содержит линейную диаграмму. Я хочу, чтобы пользователи могли выбирать цвет каждой серии в диаграмме. Поскольку выбор является динамическим, я не могу использовать статический CSS для установки цветов. У меня также есть другие элементы управления, которые мне нужно установить на тот же цвет, что и связанные ряды. Можно установить цвет линии серии динамически, используя такой код:Динамический выбор цветов символов JavaFX LIneChart

series.getNode().setStyle("-fx-stroke: " + color + ";"); 

Это хорошо работает, и я могу использовать указанный пользователем цвета на соответствующих элементов управления.

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

Большинство виджетов виджетов делают это очень легко, но я не нашел никаких подсказок здесь или на форумах Oracle. Любое руководство будет высоко оценено.

- Обновление -

Я не нашел никакого способа сделать это, кроме как перечислить все точки данных в каждой серии, возьмите соответствующий символ узел и установить стиль индивидуально. Не то, на что я надеялся. В ходе этого процесса я понял, что назначенный по умолчанию Node для символа является StackPane. Мне не нужна была такая гибкость, поэтому я заменил его на Rectangle. Это ускорило рендеринг.

ответ

0

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

Я придумал это решение. Этот код прослушивает новые серии, добавленные в график. Для каждой добавленной серии это создаст новый слушатель для данных, добавленных в серию. Этот слушатель будет искать, какая серия - это 0, 1 и т. Д., А затем найти два узла для раскраски линии и легенды/символа. Как только он установил оба, он может отказаться от подписки. Проблема может заключаться в том, что узел легенды/символа пока недоступен, когда вы получаете обратный вызов в первом добавленном дататоте.

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

final LineChart<Number, Number> chart = new LineChart<>(new NumberAxis(), new NumberAxis()); 
final ObservableList<Series<Number, Number>> series = chart.getData(); 
     series.addListener(new ListChangeListener<Series<Number, Number>>() { 
      @Override 
      public void onChanged(Change<? extends Series<Number, Number>> change) { 
       ObservableList<? extends Series<Number, Number>> list = change.getList(); 
       for (final Series<Number, Number> serie : list) { 
        serie.getData().addListener(new ListChangeListener<Data<Number, Number>>() { 
         @Override 
         public void onChanged(Change<? extends Data<Number, Number>> ignore) { 
          int index = series.indexOf(serie); 
          Set<Node> nodes = chart.lookupAll(".series" + index); 
          boolean isStyleSet = false; 
          for (Node n : nodes) { 
           if (StringUtils.isEmpty(n.getStyle())) { 
            String css = "-fx-stroke: %s; -fx-background-color: %s, white; "; 
            String color = //assign dynamically here, for instance based on the name of the series 
            n.setStyle(String.format(css, color, color)); 
            isStyleSet = true; 
           } 
          } 
          if (!isStyleSet & nodes.size() > 1) { 
           serie.getData().removeListener(this); 
          } 
         } 
        }); 
       } 
      } 
     }); 
0

У меня была проблема, которая может быть немного иной (возможно, более сложной); Мне нужно было подстроить некоторые узлы серии один цвет, другие в одной серии другого цвета (мне также нужно было динамически менять распределение цвета). Я работаю в JavaFx 2.2; У меня есть css-стиль, но, конечно, это не помогает. Я не мог найти свою проблему нигде; это было самое близкое, что я нашел.

Я просто хочу сказать, что я не мог получить "series.getNode(). SetStyle (" - fx-stroke: "+ color +"; ")" для работы. Однако, используя «-fx-background» вместо делает работы. Я надеюсь, что это помогает кому-то.

+1

Карин Вы не согласны с размещением кода?У меня есть точная проблема: у меня есть серия, содержащая кучу меньших серий, а некоторые из меньших серий я хотел бы изменить цвет линии и символа. Я не смог найти ничего о том, как программно изменить символ. Я попробовал ваше предложение, но, похоже, он не работает для меня, мне бы хотелось посмотреть, как вы берете компонент и устанавливаете цвет для символа. Благодаря! – Katie

2

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

for (int index = 0; index < series.getData().size(); index++) { 
     XYChart.Data dataPoint = series.getData().get(index); 
     Node lineSymbol = dataPoint.getNode().lookup(".chart-line-symbol"); 
     lineSymbol.setStyle("-fx-background-color: #00ff00, #000000; -fx-background-insets: 0, 2;\n" + 
       " -fx-background-radius: 3px;\n" + 
       " -fx-padding: 3px;"); 
    } 
+0

Что вы подразумеваете под данными? lineSymbol возвращает null –

+0

По ряду данных я имею в виду объект, который хранит значения каждой линии графика на диаграмме. Это было бы объявлено следующим образом: 'XYChart.Series series = new XYChart.Data ()' –

+0

будет ли это также влиять на легенду? –

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