【问题标题】:How to change bubble size in BubbleChart javafx如何在 BubbleChart javafx 中更改气泡大小
【发布时间】:2016-12-01 11:35:26
【问题描述】:

我正在编写一个javafx 程序,该程序应该显示BubbleChart 用于分析公司。在 y 轴上显示去年的收入,在 x 轴上显示公司经营的细分市场的数量。泡沫的半径取决于公司所处的细分市场。

我知道我可以通过写作来制造“泡沫”:

new XYChart.Data<Number,Number>(nbrOfMarketSegments, latestYearRevenue, radiusOfBubble);

问题是y轴最大值为100(百万欧元),x轴最大值为20,这使得“气泡”像图片中一样非常平坦(因为radiusOfBubble数字与最大数字相比很大细分市场和最大收入相比很小。我的问题是,即使x轴和y轴的跨度不同,有没有办法让气泡更圆?

BubbleChart

【问题讨论】:

    标签: java javafx bubble-chart


    【解决方案1】:

    JavaFX 图表是一段邪恶的代码。只有当您确切了解背后的代码库时,才能进行适应,这在某种程度上违背了信息隐藏的良好原则。在BubbleChart 中弄圆气泡就是其中一种改编。

    您可以做的最简单的事情是继承BubbleChart 并创建自己的圆形气泡。

    不起作用的事情:

    创建数据节点的地方(方法createBubble)是私有的,所以你不能覆盖它来创建Circles。 (除此之外 - 即使你有一个自定义数据节点,它也不会工作,因为BubbleChart 中的布局代码会忽略所有不是Ellipse 类型的数据节点,所以你最终会有圆形气泡但是都在位置 (0/0)...)。

    接下来想到的是覆盖设置省略号轴的位置。但是不,所有布局代码都是一个方法 - 没有为每个节点调用的 layoutNode(Node)-方法,您可以覆盖它以添加自定义布局代码。

    解决方案:

    所以你必须重写方法layoutPlotChildren,调用基础实现,然后改变所有节点的Y半径:

    public class CircularBubbleChart<X, Y> extends BubbleChart<X, Y> {
    
        public CircularBubbleChart(Axis<X> xAxis, Axis<Y> yAxis) {
            super(xAxis, yAxis);
        }
    
        public CircularBubbleChart(Axis<X> xAxis, Axis<Y> yAxis, ObservableList<Series<X, Y>> data) {
            super(xAxis, yAxis, data);
        }
    
        @Override
        protected void layoutPlotChildren() {
            super.layoutPlotChildren();
            getData().stream().flatMap(series -> series.getData().stream())
                .map(Data::getNode)
                .map(StackPane.class::cast)
                .map(StackPane::getShape)
                .map(Ellipse.class::cast)
                .forEach(ellipse -> ellipse.setRadiusY(ellipse.getRadiusX()));
        }
    }
    

    使用很简单:只需将图表创建代码行从... = new BubbleChart() 更改为... = new CircularBubbleChart()。其他一切都保持不变。

    注意:此代码将 Y 半径更改为等于 X 半径,因此气泡半径将以 X 轴为单位。当然,你也可以反方向得到一个气泡半径,以Y轴为单位。

    【讨论】:

    • 谢谢!这很有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 2015-08-23
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 2021-11-26
    • 2011-12-23
    相关资源
    最近更新 更多