当前位置: 首页 > 面试题库 >

JavaFX LineChart图例样式

萧琛
2023-03-14
问题内容

我想更新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
                                    }

                                });
                            }
                        }
                    }
                });
            }
        }


 类似资料:
  • 在 material design 中,图像(无论是绘画还是摄影)都应该是组建而成而并非人为策划的,看起来神奇并且不显得过度制作。这种风格乐观,愉悦,并且坦率。这种风格比较强调场景的实质性(Materiality),质感,深度,让人意想不到的色彩运用, 以及对环境背景的关注。这些原则都旨在创建目的性强,美丽又有深度的用户界面。 原则 当使用绘画和摄影提升用户体验时,选择能够表达个人关联、信息和令人

  • 产品图标 产品图标作为一个品牌下产品、服务和工具的一种视觉表现,能够简洁、显眼且友好地传递产品的核心理念与内涵。尽管每个产品图标看上去截然不同,但对于一个给定品牌,产品图标应在理念和实践中统一。 产品图标是传达品牌内涵的一个重要载体。从使用以下准则开始,确保产品图标的颜色和其他关键要素能够正确反映你的品牌标识。 设计途径 产品图标设计从现实材料的质感和触感中获得启发。每个图标都像真实纸张一样被裁剪

  • 关于图形样式 图形样式是一组可反复使用的外观属性。图形样式使您可以快速更改对象的外观;例如,您可以更改对象的填色和描边颜色、更改其透明度,还可以在一个步骤中应用多种效果。应用图形样式所进行的所有更改都是完全可逆的。您可以将图形样式应用于对象、组和图层。将图形样式应用于组或图层时,组和图层内的所有对象都将具有图形样式的属性。例如,假设您现在有一个由 50% 的不透明度组成的图形样式。如果您将此图形样

  • 本文向大家介绍BootStrap 图片样式、辅助类样式和CSS组件的实例详解,包括了BootStrap 图片样式、辅助类样式和CSS组件的实例详解的使用技巧和注意事项,需要的朋友参考一下 首先把模板代码上上来: 图片样式 .img-responsive:直接为图片添加该样式,可以实现响应式图片。 .center-block:图片居中样式,而不能使用text-center样式。 图片形状样式:.im

  • 新建一个连接 下面的代码会新建一个连接,这样你就可以和服务器交互. import boto import boto.s3.connection access_key = 'put your access key here!' secret_key = 'put your secret key here!' conn = boto.connect_s3( aws_access_ke

  • 新建一个连接 下面的代码会新建一个连接,这样你就可以和服务器交互. <?php define('AWS_KEY', 'place access key here'); define('AWS_SECRET_KEY', 'place secret key here'); define('AWS_CANONICAL_ID', 'your DHO Username'); define('AWS_CANO