Javafx 2 动态选择JavaFX线条图符号颜色
我有一个包含折线图的JavaFX应用程序。我希望用户能够选择图表中每个系列的颜色。由于选择是动态的,我不能使用静态CSS来设置颜色。我还需要将其他控件设置为与关联系列相同的颜色。可以使用如下代码动态设置序列的线条颜色:Javafx 2 动态选择JavaFX线条图符号颜色,javafx-2,Javafx 2,我有一个包含折线图的JavaFX应用程序。我希望用户能够选择图表中每个系列的颜色。由于选择是动态的,我不能使用静态CSS来设置颜色。我还需要将其他控件设置为与关联系列相同的颜色。可以使用如下代码动态设置序列的线条颜色: series.getNode().setStyle("-fx-stroke: " + color + ";"); 这很好,我可以在相关控件上使用用户指定的颜色 我的问题是,我还需要将每个系列的符号颜色设置为相同的颜色。我找不到任何方法来动态地做这件事。我在这个主题上读到的所有教
series.getNode().setStyle("-fx-stroke: " + color + ";");
这很好,我可以在相关控件上使用用户指定的颜色
我的问题是,我还需要将每个系列的符号颜色设置为相同的颜色。我找不到任何方法来动态地做这件事。我在这个主题上读到的所有教程、文档和帖子都指向静态CSS方法
大多数图表小部件使这类事情变得非常容易,但我在这里或Oracle论坛上没有发现任何线索。任何指导都将不胜感激
--更新--
除了枚举每个系列中的每个数据点,获取关联的符号节点并单独设置样式之外,我没有其他方法可以做到这一点。不是我所希望的。在这个过程中,我意识到为符号分配的默认节点是StackPane。我不需要这种灵活性,所以我用一个矩形代替了它。这使得渲染速度更快。我遇到了类似的问题。我事先不知道哪些数据将被添加到图表中,所以我不能使用固定的样式表 我想出了这个解决办法。此代码侦听添加到图形中的新系列。对于每个添加的序列,它将为添加到序列中的数据创建一个新的侦听器。 此侦听器将查找这是哪个系列,第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);
}
}
});
}
}
});
final LineChart chart=new LineChart(new NumberAxis(),new NumberAxis());
最终ObservableList系列=chart.getData();
series.addListener(新的ListChangeListener(){
@凌驾
public void onchange(Change我遇到了一个可能略有不同(可能更复杂)的问题;我需要将一系列的某些节点设置为一种颜色,将同一系列中的其他节点设置为另一种颜色(我还需要能够动态更改颜色的分配).我在JavaFx 2.2中工作;我有css样式,但这在这里当然没有帮助。我在任何地方都找不到解决我的问题的方法;这是我找到的最接近的方法
我只想说,我无法使“series.getNode().setStyle”(-fx stroke:“+color+”;”)正常工作。但是,使用“-fx background”相反,它确实有效。我希望这对某人有所帮助。我比赛迟到了,但也许有人可以使用我的解决方案。对我有效的方法是迭代数据系列中的每个项目,并为每个项目设置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;");
}
for(int index=0;index
Karin你介意发布你的代码吗?我有一个与你完全一样的问题-我有一个系列,其中包含一些较小的系列,我想更改线条和符号的颜色。我找不到任何关于如何以编程方式更改符号的内容。我尝试了你的建议,但似乎没有效果为我工作,我很想看看你是如何使用组件和设置符号的颜色的。谢谢!你所说的dataSeries是chart对的吗?lineSymbol返回nullBy data series我是指在图表上存储每条图形线的值的对象。它可能会这样声明:XYChart.series=new XYChart.Data()
这也会影响图例吗?不,这不会影响图例。您必须对图例单独应用样式。我尝试根据caspian.css和您的代码应用.chart图例,但它会给我空指针异常。您能帮我吗,我真的很绝望