2017-04-01 1 views
0

Ich möchte eine Linie in einem Balkendiagramm zeichnen. Die Linie gibt einen bestimmten Wert wieder, mit dem andere Werte verglichen werden. Ich habe die solution for a LineChart auf meine Situation angewendet (siehe Code). Es wird jedoch keine Linie gezeichnet.JavaFX kann keine Linie in BarChart zeichnen

public XYChart buildBarChart() 
    { 
     Line valueMarker = new Line(); 
     CategoryAxis xAxis = new CategoryAxis(); 
     NumberAxis yAxis = new NumberAxis(); 
     BarChart<String,Number> barChart = new BarChart<String,Number> (xAxis,yAxis); 
     barChart.setBarGap (-10); 
     barChart.setCategoryGap (0); 
     barChart.getYAxis().setTickLabelsVisible(false); 
     barChart.getYAxis().setOpacity(0);  
     yAxis.setLabel ("Score"); 

     // update marker 
     Node chartArea = barChart.lookup (".chart-plot-background"); 
     Bounds chartAreaBounds = chartArea.localToScene (chartArea.getBoundsInLocal()); 

     // remember scene position of chart area 
     yShift = chartAreaBounds.getMinY(); 

     // set x parameters of the valueMarker to chart area bounds 
     valueMarker.setStartX (chartAreaBounds.getMinX()); 
     valueMarker.setEndX (chartAreaBounds.getMaxX()); 

     // find pixel position of that value 
     double displayPosition = yAxis.getDisplayPosition (valNederland); 

     // update marker 
     valueMarker.setStartY (yShift + displayPosition); 
     valueMarker.setEndY (yShift + displayPosition); 

     BarChart.Series<String,Number> series1 = new BarChart.Series<String,Number>(); 
     BarChart.Series<String,Number> series2 = new BarChart.Series<String,Number>(); 
     BarChart.Series<String,Number> series3 = new BarChart.Series<String,Number>(); 
     BarChart.Series<String,Number> series4 = new BarChart.Series<String,Number>(); 

     series1.getData().add (new XYChart.Data<String,Number> (sRegio, valRegio_2015)); 
     series2.getData().add (new XYChart.Data<String,Number> (sOmgeving, valOmgeving)); 
     series3.getData().add (new XYChart.Data<String,Number> (sRest, valRest)); 
     series4.getData().add (new XYChart.Data<String,Number> (sNl, valNederland)); 
     barChart.getData().addAll (series1, series2, series3, series4); 

     return barChart; 
    } /*** buildBarChart ***/ 

Wichtig für diese Situation ist, die Koordinaten der ChartArea zu haben. Wenn ich die Eigenschaften von ChartArea im Debugger inspiziere, finde ich, dass alle Werte von _geomBounds "unlogisch" sind, d. H. MaxX/Y = -1 und minX/Y = -1. Ich überprüfe nur eine Zeile, nachdem chartASreaBounds einen Wert zugewiesen hat.

Für mich scheint es, dass die BarChart-Lookup fehlschlägt, da ich ein ähnliches Problem zuvor hatte. Hat jemand einen Vorschlag, wie man diese Situation korrigieren kann?

bearbeiten

Der BarChart im Konstruktor wird wie folgt erstellt:

public Charter (int nTimes, int nCategories, float [] years, String [] titles, String label, Indicator ind, float [] past) 
    { 
     this(); 

     // all kind of code to do somethong with the parameters omitted 
     // ... 

     // Setting up the BarChart. Note that past == null in my experiments 
     HBox hBox = new HBox(); 
     XYChart bar = buildBarChart(); 
     bar.setPrefHeight (height); 
     bar.setPrefWidth (width); 

     VBox buttons = buildButtonView(); 

     if (past != null) 
     { 
     XYChart line = buildLineChart(); 
     line.setPrefHeight (height); 
     line.setPrefWidth (width); 
     hBox.getChildren().addAll (bar, line); 
     } else 
     { 
     hBox.getChildren().addAll (bar); 
     } // if 
     Label dsecription = new Label (label); 
     this.getProperties().put ("--Indicator", ind.getName()); 
     this.getChildren().addAll (dsecription, hBox); 
    } /*** Charter ***/ 

Nach einer Charta erstellt wurde es an die VBox und damit zeigt auf dem Bildschirm wird hinzugefügt VBox bereits der Szene hinzugefügt.

+0

Wann wird die Methode aufgerufen? Vielleicht bevor der BarChart ausgelegt ist? – findusl

+0

Das könnte der Fall sein, ich weiß nicht, wann der BarChart ausgelegt ist. Ich habe eine Bearbeitung zu meiner Frage hinzugefügt – Arnold

Antwort

0

Es sieht so aus, als ob Sie die Position des Balkendiagramms auf dem Bildschirm berechnen möchten, bevor es zur Szene hinzugefügt wird. Da zu diesem Zeitpunkt noch nicht auf dem Bildschirm ist, ist die Position -1 oder nicht definiert.

Ich neige dazu, meine Layouts in fxml zu machen, daher erscheinen solche Probleme nicht. Wenn Sie es in Code tun müssen, denke ich zuerst, es zu den Kindern von hBox hinzuzufügen, bevor Sie die Linie ziehen, könnte das Problem lösen.

+0

Danke, ich werde das versuchen. Ich nehme an, dass ich zuerst die hBox zu einer Szene hinzufügen sollte, damit dies funktioniert. – Arnold