首页 > 解决方案 > 如何平移 JavaFX LineChart

问题描述

在 JavaFx 中,我有一个 LineChart lc,我为其创建并添加了一个系列,

lc.getData().addAll(series1);

它显示得很好,但似乎对所有数据点进行采样以将整个域放入图表中。

有没有办法强制 LineChart 只显示系列的最后 10 个数据点?

最终,我想创建一种平移图表内容的方法,以便显示数据窗口,作为平移位置的函数。

我找到了这个 SO 帖子,但它删除了数据,这意味着我需要将其添加回来。如果可能,我宁愿保留系列中的所有数据,并尽可能设置该系列的可用范围。

标签: javafxlinechart

解决方案


我使用标准的 fx 库自己制定了解决方案。

只要横轴是 a NumberAxis,就可以使用setLowerBound()setUpperBound()函数。

结合滚动条,这完美地工作。

例如,

    final static int MAX_DISPLAY = 100
    LineChart<Number, Number> lineChart;
    ScrollBar scroller;

    scroller.setMin(0);
    scroller.setMax(1000 - MAX_DISPLAY);

    scroller.valueProperty().addListener(new ChangeListener<Number>() {

        @Override
        public void changed(ObservableValue<? extends Number> observableValue, Number number, Number t1) {

            double pos = scroller.getValue();

            NumberAxis na = (NumberAxis)lineChart.getXAxis();
            na.setLowerBound(pos);
            na.setUpperBound(pos + MAX_DISPLAY);
        }
    });

注意 - 如果使用 Scene Builder,您的 LineChart x 轴将默认为 CatergoryAxis,因此请确保编辑 .fxml 文件并将其手动更改为 NumberAxis。

此外,对于我的用例,因为 x 轴代表 Unix 纪元时间,您可以Number使用以下代码(在我的情况下为日期格式的字符串)将值转换为其他值,

        NumberAxis xAxis = (NumberAxis)lineChart.getXAxis();

        xAxis.setTickLabelFormatter(new StringConverter<Number>() {

            @Override
            public String toString(Number object) {

                return convertToDate(object.longValue());
            }

            @Override
            public Number fromString(String string) {
                return 0;
            }
        });

推荐阅读