JavaFX LineChart图例样式

我想更新LineChart图例的样式,我在具有相应系列类的节点上使用setStyle。

String color = ....

XYChart.Series<Number, Number> series = new XYChart.Series<Number, Number>();

_chart.getData().add(series);

String seriesClass = null;

for(String styleClass : series.getNode().getStyleClass())

{

if(styleClass.startsWith("series"))

{

seriesClass = styleClass;

break;

}

}

if(seriesClass != null)

{

//

// Customize the style.

//

StringBuilder sb = new StringBuilder();

sb.append("-fx-stroke: ");

sb.append(color);

sb.append("; ");

sb.append("-fx-background-color: ");

sb.append(color);

sb.append(", white;");

if(doted)

{

sb.append("-fx-stroke-dash-array: 10 10");

}

_styles.put(seriesClass, sb.toString());

}

java.util.Set<javafx.scene.Node> nodes = _chart.lookupAll("." + seriesClass);

for(javafx.scene.Node n : nodes)

{

n.setStyle(style);

}

事实是,这只会影响路径的样式,图例样式不会改变。我已经打印了图表节点的子级,并看到在添加系列调用返回后未完全创建图例:

Legend@18e8627[styleClass=chart-legend]

Label@1689c98[styleClass=label chart-legend-item]

Label@100e4ce[styleClass=label chart-legend-item]

Label@1adcb5e[styleClass=label chart-legend-item]

Label@102a8fb[styleClass=label chart-legend-item]

过一会儿,如果我再次打印孩子:

Legend@9a095[styleClass=chart-legend]

Label[id=null, styleClass=label chart-legend-item]

LabelSkin[id=null, styleClass=label chart-legend-item]

Region@12acafc[styleClass=chart-legend-item-symbol chart-line-symbol series0 default-color0]

LabeledText@749a47[styleClass=text]

Label[id=null, styleClass=label chart-legend-item]

LabelSkin[id=null, styleClass=label chart-legend-item]

Region@3ca3a4[styleClass=chart-legend-item-symbol chart-line-symbol series1 default-color1]

LabeledText@11b9972[styleClass=text]

Label[id=null, styleClass=label chart-legend-item]

LabelSkin[id=null, styleClass=label chart-legend-item]

Region@57f433[styleClass=chart-legend-item-symbol chart-line-symbol series2 default-color2]

LabeledText@6172b5[styleClass=text]

Label[id=null, styleClass=label chart-legend-item]

LabelSkin[id=null, styleClass=label chart-legend-item]

Region@16458ed[styleClass=chart-legend-item-symbol chart-line-symbol series3 default-color3]

LabeledText@10a68bd[styleClass=text]

如果我现在更新样式,则图例样式会正确更新。

我怎么知道何时添加了带有设置样式所需类的Region子项,以便可以在该节点上设置setStyle?

添加新系列后,还有其他想法可以更新图例样式吗?

回答:

我也遇到了这个问题。解决方案可以检测出图例项目的创建时间,以便可以向其添加动态样式。

我在图例的“

getChildrenUnmodifiable()”的ObservableList中添加了一个ListChangeListener,这又为图例的每个子级添加了一个ListChangeListener。从此侦听器中,我们可以知道何时将新项目添加到图例(或删除)。然后,我们可以进行动态样式更改。

for (Node n : lineChart.getChildrenUnmodifiable())

{

if (n instanceof Legend)

{

final Legend legend = (Legend) n;

// remove the legend

legend.getChildrenUnmodifiable().addListener(new ListChangeListener<Object>()

{

@Override

public void onChanged(Change<?> arg0)

{

for (Node node : legend.getChildrenUnmodifiable())

{

if (node instanceof Label)

{

final Label label = (Label) node;

label.getChildrenUnmodifiable().addListener(new ListChangeListener<Object>()

{

@Override

public void onChanged(Change<?> arg0)

{

//make style changes here

}

});

}

}

}

});

}

}

以上是 JavaFX LineChart图例样式 的全部内容, 来源链接: utcz.com/qa/425487.html

回到顶部