【问题标题】:Dynamically selecting JavaFX LIneChart symbol colors动态选择 JavaFX LNeChart 符号颜色
【发布时间】:2013-09-27 05:00:36
【问题描述】:

我有一个包含折线图的 JavaFX 应用程序。我希望用户能够选择图表中每个系列的颜色。由于选择是动态的,我不能使用静态 CSS 来设置颜色。我还有其他控件需要设置为与关联系列相同的颜色。可以使用如下代码动态设置系列的线条颜色:

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

效果很好,我可以在相关控件上使用用户指定的颜色。

我的问题是我还需要将每个系列的符号颜色设置为相同的颜色。我找不到任何方法来动态地做到这一点。我阅读过的关于该主题的所有教程、文档和帖子都指向静态 CSS 方法。

大多数图表小部件使这类事情变得非常容易,但我在这里或 Oracle 论坛上没有找到任何线索。任何指导将不胜感激。

-- 更新--

除了枚举每个系列中的每个数据点,获取关联的符号节点并单独设置样式外,我没有其他方法可以做到这一点。不是我所希望的。在此过程中,我意识到为符号分配的默认节点是 StackPane。我不需要那种灵活性,所以我用矩形代替了它。这使得渲染速度更快。

【问题讨论】:

    标签: javafx-2


    【解决方案1】:

    我遇到了类似的问题。我不知道将哪些数据添加到图表中,所以我不能使用固定的样式表。

    我想出了这个解决方案。此代码侦听添加到图形的新系列。对于每个添加的系列,它将为添加到系列中的数据创建一个新的侦听器。 此侦听器将查找这是哪个系列,第 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);
                                }
                            }
                        });
                    }
                }
            });
    

    【讨论】:

      【解决方案2】:

      我遇到的问题可能略有不同(可能更复杂);我需要为一个系列的一些节点设置一种颜色,同一系列中的其他节点另一种颜色(我还需要能够动态更改颜色的分配)。我正在使用 JavaFx 2.2;我有 css 样式,但这当然在这里没有帮助。我在任何地方都找不到我的问题;这是我找到的最接近的。

      我只想说我无法让 "series.getNode().setStyle("-fx-stroke: " + color + ";")" 工作。但是,使用“-fx-background”代替确实 工作。我希望这对某人有所帮助。

      【讨论】:

      • Karin 你介意发布你的代码吗?我有你做的确切问题 - 我有一个包含一堆较小系列的系列,以及一些较小的系列我想更改线条和符号的颜色。我无法找到有关如何以编程方式更改符号的任何内容。我尝试了您的建议,但它似乎对我不起作用,我很想看看您如何使用组件并设置符号的颜色。谢谢!
      【解决方案3】:

      我迟到了,但也许有人可以使用我的解决方案。对我有用的是遍历数据系列中的每一项并为每一项设置 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;");
          }
      

      【讨论】:

      • 你所说的dataSeries是图表对吗? lineSymbol 返回 null
      • 数据系列是指存储图表上每条图形线值的对象。可能会这样声明:XYChart.Series&lt;String, Number&gt; series = new XYChart.Data&lt;String, Number&gt;()
      • 这也会影响传说吗?
      • 不,这不会影响图例。您必须单独对图例应用样式。
      • 我尝试根据 caspian.css 和您的代码应用 .chart-legend,但它给了我空指针异常。你能帮帮我吗,我真的很绝望
      猜你喜欢
      • 2016-06-29
      • 2015-07-28
      • 1970-01-01
      • 1970-01-01
      • 2014-12-17
      • 2015-06-19
      • 1970-01-01
      • 2015-05-28
      • 2014-05-13
      相关资源
      最近更新 更多