JavaFX图表是一段邪恶的代码。只有当你完全了解背后的代码基础时,才能实现自适应,这在某种程度上违背了信息隐藏的良好原则。在BubbleChart
中获得圆形气泡是其中一种适应。
您可以做的最简单的事情是将子类BubbleChart
并创建自己的圆形气泡。
东西不起作用:
在其中创建数据节点的地方(方法createBubble
)是私有的,所以你不能覆盖它来创建Circle
!而非。 (除此之外 - 即使你有一个自定义数据节点,它也不会工作,因为BubbleChart
中的布局代码忽略了所有不是Ellipse
类型的数据节点,所以你最终会得到圆形的气泡,但所有的位置0/0)...)。
想到的下一件事是重写省略号轴的设置位置。但是,不,所有的布局代码都是单一的方法 - 没有为每个节点调用的方法,并且您可以覆盖以添加自定义布局代码。
解决方案:
所以,你必须要覆盖的方法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-Radius,因此气泡半径将以X轴为单位。当然,你也可以在相反的位置获得以Y轴为单位的气泡半径。
谢谢!这非常有帮助! – ekstroom