我正在编写一个javafx
程序,该程序应该显示BubbleChart
公司分析。在 y 轴上显示去年的收入,在 x 轴上显示公司经营的细分市场的数量。泡沫的半径取决于公司经营的细分市场。
我知道我可以通过写作来制造“泡沫”:
new XYChart.Data<Number,Number>(nbrOfMarketSegments, latestYearRevenue, radiusOfBubble);
问题是 y 轴最大值为 100(百万欧元),x 轴最大值为 20,这使得图中的“气泡”非常平坦(因为radiusOfBubble
与细分市场的最大数量相比,数字大而小到最大收入。我的问题是,即使 x 轴和 y 轴具有如此不同的跨度,有没有办法使气泡更圆?
JavaFX 图表是一段邪恶的代码。只有当您确切知道背后的代码库时,才有可能进行改编,这在某种程度上违背了信息隐藏的良好原则。在 a 中获得圆形气泡BubbleChart
是这些适应之一。
您可以做的最简单的事情是BubbleChart
创建子类并创建您自己的圆形气泡。
不起作用的事情:
创建数据节点的地方(method createBubble
)是私有的,所以你不能覆盖它来创建Circle
s。(除此之外 - 即使你有一个自定义数据节点,它也不会工作,因为布局代码会BubbleChart
忽略所有不是 type 的数据节点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 轴为单位的气泡半径。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句