私は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 ***/
後シーンに追加されました。
メソッドはいつ呼び出されますか? BarChartがレイアウトされる前かもしれませんか? – findusl
そうかもしれないが、私はBarChartがいつレイアウトされるのか分からない。私は私の質問に編集を加えました – Arnold