Как панорамировать JavaFX LineChart - PullRequest
0 голосов
/ 28 апреля 2019

В JavaFx у меня есть LineChart lc, для которого я создаю и добавляю серии,

lc.getData().addAll(series1);

Отображается просто отлично, но, похоже, для выборки всех точек данных помещается весь график в диаграмму.

Есть ли способ заставить LineChart просто отобразить последние 10 точек данных, скажем, серии?

В конечном итоге я хотел бы создать способ панорамирования содержимого диаграммы, чтобы отображалось окно данных в зависимости от положения панорамирования.

Я нашел этот пост , но он удаляет данные, а значит, мне нужно было бы добавить его обратно. Я предпочел бы сохранить все данные в серии, если это возможно, и установить диапазон использования этой серии, если это возможно.

1 Ответ

0 голосов
/ 28 апреля 2019

Я сам разработал решение, используя стандартные библиотеки 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, для вашей оси X LineChart по умолчанию будет 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;
            }
        });
...