如何平移JavaFX LineChart

时间:2019-04-28 11:48:25

标签: javafx linechart

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

lc.getData().addAll(series1);

它显示得很好,但是似乎对所有个数据点进行了采样,以使整个域适合图表。

是否有一种方法可以强制LineChart仅显示该系列的最后10个数据点?

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

我找到了this SO post,但是它删除了数据,这意味着我需要将其重新添加回去。我宁愿将所有数据保留在系列中,并尽可能设置该系列的可用范围。

1 个答案:

答案 0 :(得分:0)

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

只要水平轴为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;
            }
        });