【问题标题】:JavaFX Axis AutoRangeing ignore Series who are not visibleJavaFX Axis AutoRangeing 忽略不可见的系列
【发布时间】:2017-07-06 23:09:25
【问题描述】:

我有一个 LineChart 带有自动量程 x 和 y 轴,但我可以通过切换一个将 .setVisible() 更改为相反的按钮来隐藏我的一些 Series

private LineChart<String, Number> chart;
@FXML
private void initialize() {
    chart.getXAxis().setAutoRanging(true);
    chart.getYAxis().setAutoRanging(true);

}

有没有办法仍然自动调整轴并让他们忽略不可见的Series

【问题讨论】:

    标签: java javafx linechart axis-labels


    【解决方案1】:

    我最近一直在努力解决同样的问题,并通过以下方式扩展 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 函数忽略。 要隐藏系列,请在系列对象上使用命令:getNode().setVisible(false)。要使用 FXML 嵌入图表,您需要删除 FXML 文件中的 &lt;xAxis&gt;&lt;yAxis&gt;。此外,您需要将 LineChart 更改为 MyLineChart 并更新导入。

    此方法也可以适应其他轴类型 - 只需在 MyLineChart 类中更改它们即可。

    希望我能帮上忙!

    【讨论】:

      猜你喜欢
      • 2014-08-01
      • 1970-01-01
      • 2017-08-20
      • 2013-10-20
      • 2017-12-25
      • 2020-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多