JavaFX LineChart Manually Setting X-Axis Values


Question

I am new to Java and so to JavaFX. I am trying to build a dynamic graph which displays live data using JavaFx LineChart. I am using NumberAxis to set values for my X-Axis. I tried using both the constructors of NumberAxis and noticed that it automatically sets the X-Axis values as 1,2,3,4..etc.

But I want to display values in a different order like 1,3,4,5,2... and not in ascending order. Could someone please guide me in this regard ? Any help is very much appreciated. Thanks !

Here is how my code looks,

public class UI extends Application{

@SuppressWarnings("unchecked")
public static XYChart.Series series = new XYChart.Series();
public static XYChart.Series series1 = new XYChart.Series();


/**
 * @param args
 */ 


public static void main(String[] args) {        
    launch(args);
}

@Override 
public void start(Stage primaryStage) throws Exception {
    BorderPane border = new BorderPane();
    //HBox hbox = addHBox();
    border.setTop(addHBox());
    border.setCenter(addLineChart());

    Scene scene = new Scene(border);

    primaryStage.setScene(scene);
    primaryStage.setHeight(570);
    primaryStage.setWidth(700);
    //primaryStage.setResizable(false);
    primaryStage.centerOnScreen();


    //primaryStage.setFullScreen(true);


    primaryStage.show();
}

public HBox addHBox() {
    HBox hbox = new HBox();
    hbox.setStyle("-fx-background-color: #e6e6fa;");//d3d3d3 gray, f5f5f5 smoke white


    hbox.setPadding(new Insets(0, 0, 0, 560));
    hbox.setSpacing(10);

    hbox.setMaxWidth(10);
    hbox.setStyle("-fx-background-color: #e6e6fa;");//d3d3d3 gray, f5f5f5 smoke white

    //Label logoLabel = new Label();
    Image logoImage = new Image(getClass().getResourceAsStream("Logo.jpeg"));       
    ImageView logoImageViewer = new ImageView();        
    //Rectangle2D viewportRect = new Rectangle2D(40, 35, 110, 110);
    //logoImageViewer.setViewport(viewportRect);

    logoImageViewer.setImage(logoImage);        
    logoImageViewer.setPreserveRatio(true);
    logoImageViewer.setSmooth(true);
    logoImageViewer.setCache(true);

    hbox.getChildren().add(logoImageViewer);
    return hbox;
}



public Node addLineChart(){

    //final NumberAxis xAxis = new NumberAxis(1,10,1);      
    final CategoryAxis xAxis = new CategoryAxis();

    xAxis.setAutoRanging(false);


    final NumberAxis yAxis = new NumberAxis(-80,60,20);        
    yAxis.setMinorTickVisible(false);




    final LineChart<String,Number> lineChart = new LineChart<String,Number>(xAxis,yAxis);




    //populating the series with data
    series.getData().add(new XYChart.Data("1", 20.222222222));//Math.random()));
    series.getData().add(new XYChart.Data("3", 0));//Math.random()));
    series.getData().add(new XYChart.Data("4", 1));//Math.random()));
    series.getData().add(new XYChart.Data("2", -60.11111));//Math.random()));

    lineChart.getData().add(series);
    lineChart.setLegendVisible(false);

    return lineChart;
}

}

Exception seen on using CategoryAxis,

Exception in Application start method
Exception in thread "main" java.lang.RuntimeException: Exception in Application start    method
     at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:403)
     at com.sun.javafx.application.LauncherImpl.access$000(LauncherImpl.java:47)
     at com.sun.javafx.application.LauncherImpl$1.run(LauncherImpl.java:115)
     at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
    at javafx.scene.chart.Axis.layoutChildren(Axis.java:634)
    at javafx.scene.Parent.layout(Parent.java:1018)
    at javafx.scene.chart.XYChart.layoutChartChildren(XYChart.java:684)
    at javafx.scene.chart.Chart$1.layoutChildren(Chart.java:84)
    at javafx.scene.Parent.layout(Parent.java:1018)
    at javafx.scene.Scene.layoutDirtyRoots(Scene.java:513)
    at javafx.scene.Scene.doLayoutPass(Scene.java:484)
    at javafx.scene.Scene.preferredSize(Scene.java:1485)
    at javafx.scene.Scene.impl_preferredSize(Scene.java:1512)
    at javafx.stage.Window$10.invalidated(Window.java:719)
    at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:127)
    at javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:161)
    at javafx.stage.Window.setShowing(Window.java:782)
    at javafx.stage.Window.show(Window.java:797)
    at javafx.stage.Stage.show(Stage.java:229)
    at com.bosch.mvci.ford.powerbalance.ui.UI.start(UI.java:184)
    at com.sun.javafx.application.LauncherImpl$5.run(LauncherImpl.java:319)
    at com.sun.javafx.application.PlatformImpl$5.run(PlatformImpl.java:206)
    at com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:173)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:29)
    at com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:73)
... 1 more`
1
2
12/19/2012 7:45:16 PM

Accepted Answer

Use a CategoryAxis for your x axis.

1
12/19/2012 5:50:58 PM

Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow
Icon