2017-04-01 28 views
0

私はBarchartに線を描きたいです。線は、他の値が比較される特定の値を反映する。自分の状況にsolution for a LineChartを適用しました(コードを参照)。ただし、線は描画されません。JavaFXはBarChartで線を描くことができません

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 ***/ 

この状況で重要なのは、ChartAreaの座標を持つことです。デバッガでChartAreaのプロパティを調べると、_geomBoundsのすべての値が 'unlogic'、つまりmaxX/Y = -1およびminX/Y = -1であることがわかります。私は、chartASreaBoundsに値が代入された後、ただ1行だけを検査します。

私には、前と同じような問題があったので、barChartの検索が失敗するようです。誰もがこの状況を修正する方法の提案を持っていますか?

編集

次のようにBarChartコントロールは、コンストラクタで作成されます:VBoxのがすでにあるよう憲章は、それが画面上に番組のVBoxに、それと共に追加され作成された

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 ***/ 

後シーンに追加されました。

+0

メソッドはいつ呼び出されますか? BarChartがレイアウトされる前かもしれませんか? – findusl

+0

そうかもしれないが、私はBarChartがいつレイアウトされるのか分からない。私は私の質問に編集を加えました – Arnold

答えて

0

シーンに追加する前に、画面上の棒グラフの位置を計算したいようです。その時点ではまだ位置は-1であるか、または定義されていないということは画面上にはないからです。

私はfxmlで自分のレイアウトを作成する傾向があります。そのような問題は現れません。コードで行う必要がある場合は、まず線を描画する前にhBoxの子に追加して問題を解決できると思います。

+0

ありがとう、私はそれを試みます。私はこの作業をするためにまずシーンにhBoxを追加する必要があると推測します。 – Arnold

関連する問題