JavaFX LineChart手动设置X轴值

时间:2012-12-19 07:06:07

标签: java javafx

我是Java新手,也是JavaFX的新手。我正在尝试构建一个动态图表,使用JavaFx LineChart 显示实时数据。我正在使用 NumberAxis 为我的X轴设置值。我尝试使用NumberAxis的两个构造函数,并注意到它会自动将X轴值设置为1,2,3,4..etc。

但我希望以不同的顺序显示值,如1,3,4,5,2 ......而不是按升序显示。有人可以在这方面指导我吗?很感谢任何形式的帮助。谢谢 !

以下是我的代码的外观,

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;
}

}

使用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 个答案:

答案 0 :(得分:1)

为x轴使用CategoryAxis