0

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

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

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

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

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

- 更新 -

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

4

3 回答 3

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;");
    }
于 2017-03-28T10:39:22.740 回答
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);
                            }
                        }
                    });
                }
            }
        });
于 2014-01-15T16:04:16.383 回答
0

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

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

于 2015-09-02T21:08:27.387 回答