我得到了一个LineChart
的自动调整x轴和y轴,但是我可以通过切换一个按钮来隐藏我的Series
部分,这个按钮会将.setVisible()
更改为相反的。
private LineChart<String, Number> chart;
@FXML
private void initialize() {
chart.getXAxis().setAutoRanging(true);
chart.getYAxis().setAutoRanging(true);
}
有没有办法让自动调整轴并让他们忽略不可见的Series
?
迎接
答案 0 :(得分:0)
我最近一直在努力解决同样的问题,并通过以下方式扩展LineChart类来解决它:
public class MyLineChart extends LineChart<String, Number> {
public MyLineChart() {
super(new CategoryAxis(), new NumberAxis());
}
@Override
protected void updateAxisRange() {
final Axis<String> xa = getXAxis();
final Axis<Number> ya = getYAxis();
List<String> xData = null;
List<Number> yData = null;
if (xa.isAutoRanging())
xData = new ArrayList<String>();
if (ya.isAutoRanging())
yData = new ArrayList<Number>();
if (xData != null || yData != null) {
for (Series<String, Number> series : getData()) {
if (series.getNode() != null && !series.getNode().isVisible())
continue;
for (Data<String, Number> data : series.getData()) {
if (xData != null)
xData.add(data.getXValue());
if (yData != null)
yData.add(data.getYValue());
}
}
// RT-32838 No need to invalidate range if there is one data item -
// whose value is zero.
if (xData != null && !(xData.size() == 1
&& getXAxis().toNumericValue(xData.get(0)) == 0)) {
xa.invalidateRange(xData);
}
if (yData != null && !(yData.size() == 1
&& getYAxis().toNumericValue(yData.get(0)) == 0)) {
ya.invalidateRange(yData);
}
}
}
}
如您所见,方法updateAxisRange()
负责范围界限。给定的代码取自原始实现,但增加了以下内容:
if (series.getNode() != null && !series.getNode().isVisible())
continue;
通过这些更改,将跳过隐藏序列,并由autoRange函数忽略。
要隐藏序列,请在Series对象上使用命令getNode().setVisible(false)
。要使用FXML嵌入图表,您需要删除FXML文件中的<xAxis>
和<yAxis>
。此外,您需要将LineChart更改为MyLineChart并更新导入。
此方法也可以适应其他轴类型 - 只需在MyLineChart类中更改它们。
希望我能帮忙!