import javafx.application.Application; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.scene.Scene; import javafx.scene.chart.CategoryAxis; import javafx.scene.chart.LineChart; import javafx.scene.chart.NumberAxis; import javafx.scene.chart.XYChart; import javafx.scene.control.ScrollBar; import javafx.scene.layout.Priority; import javafx.scene.layout.VBox; import javafx.stage.Stage; import java.util.ArrayList; import java.util.List; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.control.Button; import javafx.scene.layout.HBox; /** * Author: Andriy Yatsynych * Date: 10/10/12 * Time: 12:39 AM */ public class Bug extends Application { private XYChart.Series series; private final List dataList = new ArrayList(6); @Override public void start(Stage stage) throws Exception { String ver = com.sun.javafx.runtime.VersionInfo.getRuntimeVersion(); System.out.println("javafx.runtime.version: " + ver); stage.setTitle("Scrollable Chart"); //defining the axes final CategoryAxis xAxis = new CategoryAxis(); xAxis.setAutoRanging(false); // Comment out this line to avoid NPE final NumberAxis yAxis = new NumberAxis(); final LineChart lineChart = new LineChart(xAxis, yAxis); series = new XYChart.Series(); dataList.add(new XYChart.Data("one", 5)); dataList.add(new XYChart.Data("two", 12)); dataList.add(new XYChart.Data("three", 6)); dataList.add(new XYChart.Data("four", 19)); dataList.add(new XYChart.Data("five", 1)); dataList.add(new XYChart.Data("six", 7)); //Pre-filled test data, displaying everything except one (last) element series.getData().addAll(dataList.subList(0, 5)); lineChart.getData().add(series); final VBox vb = new VBox(); vb.getChildren().add(lineChart); VBox.setVgrow(lineChart, Priority.ALWAYS); Button add = new Button("Right"); add.setOnAction(new EventHandler() { @Override public void handle(ActionEvent event) { series.getData().remove(0); XYChart.Data dataItem = new XYChart.Data(dataList.get(5).getXValue(), dataList.get(5).getYValue()); series.getData().add(dataItem); } }); Button left = new Button("Left"); left.setOnAction(new EventHandler() { @Override public void handle(ActionEvent event) { series.getData().remove(4); XYChart.Data dataItem = new XYChart.Data(dataList.get(0).getXValue(), dataList.get(0).getYValue()); xAxis.getCategories().add(0, (String) dataItem.getXValue()); series.getData().add(0, dataItem); } }); HBox hBox = new HBox(); hBox.getChildren().addAll(add, left); vb.getChildren().add(hBox); Scene scene = new Scene(vb, 800, 600); stage.setScene(scene); stage.show(); } public static void main(String[] args) { launch(args); } }