【问题标题】:JavaFX BarChart implementation - why use StackPanes for bars?JavaFX BarChart 实现 - 为什么将 StackPanes 用于条形图?
【发布时间】:2015-04-23 21:50:26
【问题描述】:

我最近一直在深入研究 JavaFX 中图表的实现,并注意到在 BarChart.java 中,StackPanes 用于各个条形图,如下所示:

bar = new StackPane();
item.setNode(bar);
bar.getStyleClass().addAll("chart-bar", "series" + seriesIndex, "data" + itemIndex);

稍后(layoutPlotChildren(...)):

bar.resizeRelocate(xPos, bottom, barWidth, top - bottom);

在我看来,更合乎逻辑的选择是使用矩形,特别是因为 JavaFX Peformance Tips and Tricks 声明使用形状类(即使它们必须重新创建,因为它们不能直接调整大小比使用更快区域/窗格)。

我问这个问题的主要原因是因为我有一个自定义图表实现(烛台图),它使用矩形作为蜡烛,并且我希望以相同的方式设置条形。为 Rectangle 创建样式类使用不同的 CSS 属性(-fx-fill-fx-smooth-fx-stroke 等),而 Region/Pane 使用 -fx-background-color-fx-border-color,甚至没有指定的选项-fx-smooth 所以我不能为蜡烛和酒吧使用一个主要样式类。

BarChart 使用 StackPane 的事实给我留下了几个问题:

  • 为什么?是因为一些我不明白的奇怪的性能原因吗?
  • 选择是任意的吗?另一个大致相同但使用矩形的实现是否也一样好?
  • BarChart 中条形图的颜色是用-fx-bar-fill 属性指定的(在JavaFX CSS Reference Guide 中没有记录),但此外,我在 OpenJFX 源中找不到指定和查找此属性的任何地方,如何这真的有效吗?
  • 在 Ensemble8 Candle.java 中的 CandleStickChart 实现中,各个蜡烛(非常类似于 BarChart 的条)实际上是包含灯芯线和蜡烛本身的区域的组。这与我个人的实现不同,也与 BarChart 实现不同 - 再次,这种选择是任意的,还是有充分的理由使用这些类而不是 2 个矩形或一个矩形和 1 条线,比如说。

【问题讨论】:

    标签: java charts javafx javafx-8


    【解决方案1】:

    为什么对条形图使用 StackPanes?

    我不了解 JavaFX 团队的想法,但我怀疑选择是因为 CSS 支持。因为StackPane继承自Region,所以它支持非常丰富的可样式属性集,比如背景、边框,甚至形状。例如,在BarChart 中,您可以仅使用外部样式表在条上设置任意背景图像。相比之下,Shapes 支持更有限的一组可样式化属性。理论上,直接使用StackPane 而不是Region 将允许向条形图添加更多节点的可能性,尽管我认为任何这样的代码都会非常难看。

    BarChart 中的条形颜色由 -fx-bar-fill 指定 属性...这实际上是如何工作的?

    -fx-bar-fill 是在默认样式表modena.css 中定义的looked-up color。一般来说,默认样式表的文档很差:除了查看上面链接的源代码之外,没有真正的方法可以知道为哪些节点类型定义了哪些查找颜色(但公平地说,很难看到任何此类文档可能看起来像带有正确信息的任何形式,并且无论如何都比 css 文件更易于访问)。

    在 Ensemble8 的 CandleStickChart 实现中......又是这个 选择任意或有充分的理由将这些类用作 与 2 个矩形或 1 个矩形和 1 条线相对。

    鉴于烛台图表节点看起来像一条线和一个矩形,使用包含一条线和其他内容的Group 是有意义的。如果您接受有关条形图 CSS 的论点,那么使用 RegionRegion 某种子类对我来说是有意义的。

    【讨论】:

    • 因此,如果不需要那些更高级的样式功能,因为我只想要一个带有锐利(非平滑)边框的彩色条 - 使用形状(例如矩形)而不是区域会更好?还有关于-fx-bar-fill,我的意思是更多它在OpenJFX源代码中的位置?是的,它在 modena.css 中,但是 BarChart 实现如何知道要专门查找该属性?
    • 顺便说一句,与问题或答案没有直接关系:“任何此类文档可能以任何形式呈现正确的信息并且无论如何都比 css 文件更易于访问”- > 我认为此类文档类似于a ZK style guide component definition
    • 我对选择 Pane/Region 与 Shape 的性能特征和影响非常感兴趣(尤其是在频繁重新绘制条形图/蜡烛图的情况下)。
    • @brcolow modena.css 将-fx-background-color 定义为.chart-bar(由StackPane 表示的栏的样式类)为线性渐变,根据查找的颜色定义-fx-bar-fill。 (这是在-fx-bar-fill 的默认定义之后立即上线的。)-fx-background-color 链接到Background 类中的Background 属性(并且在CSS 文档中有详细记录)。至于性能,ShapeRegion 便宜似乎是合理的,但我还没有真正测试过这个假设。
    • 感谢fx-bar-fill 的解释 - 测试不同实现的最佳方法是什么?有没有好的方法来衡量这些东西?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多