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