2012-12-19 62 views
2

我是Java新手,對JavaFX也是如此。我正嘗試構建一個使用JavaFx LineChart顯示實時數據的動態圖形。我正在使用NumberAxis來爲我的X軸設置數值。我嘗試使用兩個NumberAxis的構造函數,並注意到它會自動將X軸值設置爲1,2,3,4..etc。JavaFX LineChart手動設置X軸值

但我想顯示不同的順序,如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

使用您的x軸的CategoryAxis

+0

嗨jewelsea,謝謝你的迴應。我其實嘗試使用CategoryAxis,但我的stage.show與空指針異常崩潰。我也修改了原始文章中的代碼,並添加了錯誤。請建議。 – user1724114

+0

很抱歉提出基本問題。我是一個新手,我使用'CategoryAxis(FXCollections.observableArrayList(「1」,「3」,「4」,「2」))'構造函數而不是空的構造函數,它工作。這有點奇怪,因爲oracle文檔示例使用了空的構造函數[link](http://docs.oracle.com/javafx/2/charts/line-chart.htm#CIHGBCFI) – user1724114

+0

在您的示例中,您[setAutoRanging] (http://docs.oracle.com/javafx/2/api/javafx/scene/chart/Axis.html#setAutoRanging%28boolean%29)爲false,這要求您明確提供'CategoryAxis'的可用值,Oracle文檔樣本不會這樣做。 – jewelsea