Один из способов, который я могу придумать, это иметь дело с ScrollBar (s) вместо ScrollPane.Вы можете установить минимальное / максимальное значение полосы прокрутки с нижними / верхними границами оси.А при изменении значения прокрутки обновите границы оси соответственно.Нечто подобное ..
final AreaChart chart = new AreaChart(xAxis, yAxis);
ScrollBar scroll = new ScrollBar();
scroll.setMin(chartLowerBound);
scroll.setMax(chartUpperBound);
scroll.setVisibleAmount(10 * tickUnit);
scroll.valueProperty().addListener((obs, old, nxtLb) -> {
double nxtUb = nxtLb.doubleValue() + (10 * tickUnit);
xAxis.setUpperBound(nxtUb);
xAxis.setLowerBound(nxtLb.doubleValue());
});
Ниже приведен пример быстрой работы.Постарайтесь понять базовую логику и реализовать ее в соответствии с вашими потребностями.
import java.util.Random;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.chart.AreaChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart.Data;
import javafx.scene.chart.XYChart.Series;
import javafx.scene.control.ScrollBar;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class ScrollableChartDemo extends Application {
public static void main(String... args) {
launch(args);
}
@Override
public void start(Stage stage) throws Exception {
stage.setTitle("Scrollable Chart");
Random random = new Random(12);
double tickUnit = .04;
double chartLowerBound = 0;
double chartUpperBound = 4;
final ObservableList<Data> seriesData = FXCollections.observableArrayList();
Series series = new Series("Series 1", seriesData);
final ObservableList<Data> series2Data = FXCollections.observableArrayList();
Series series2 = new Series("Series 2", series2Data);
double tempoXAxis = 0.0;
for (int i = 0; i < 100; i++) {
seriesData.add(new Data(tempoXAxis, random.nextInt(12)));
series2Data.add(new Data(tempoXAxis, random.nextInt(12)));
tempoXAxis += tickUnit;
}
final ObservableList<Series> allSeriesData = FXCollections.observableArrayList(series, series2);
NumberAxis xAxis = new NumberAxis("Time", 0, (10 * tickUnit), tickUnit);
NumberAxis yAxis = new NumberAxis();
final AreaChart chart = new AreaChart(xAxis, yAxis);
chart.getData().addAll(allSeriesData);
VBox.setVgrow(chart, Priority.ALWAYS);
ScrollBar scroll = new ScrollBar();
scroll.setMin(chartLowerBound);
scroll.setMax(chartUpperBound - (10 * tickUnit));
scroll.setVisibleAmount(10 * tickUnit);
scroll.valueProperty().addListener((obs, old, nxtLb) -> {
double nxtUb = nxtLb.doubleValue() + (10 * tickUnit);
xAxis.setUpperBound(nxtUb);
xAxis.setLowerBound(nxtLb.doubleValue());
});
chart.setOnScroll((ev) -> {
double nxtUb;
double nxtLb;
if (ev.getDeltaY() > 0) {
nxtUb = xAxis.getUpperBound() + tickUnit;
if (nxtUb > chartUpperBound) {
nxtUb = chartUpperBound;
}
nxtLb = nxtUb - (10 * tickUnit);
} else {
nxtLb = xAxis.getLowerBound() - tickUnit;
if (nxtLb < chartLowerBound) {
nxtLb = chartLowerBound;
}
nxtUb = nxtLb + (10 * tickUnit);
}
xAxis.setUpperBound(nxtUb);
xAxis.setLowerBound(nxtLb);
scroll.setValue(nxtLb);
ev.consume();
});
VBox vb = new VBox();
vb.setSpacing(5);
vb.getChildren().addAll(chart, scroll);
Scene scene = new Scene(vb);
stage.setScene(scene);
stage.setWidth(1000);
stage.setHeight(700);
stage.show();
}
}