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.
Wann wird die Methode aufgerufen? Vielleicht bevor der BarChart ausgelegt ist? – findusl
Das könnte der Fall sein, ich weiß nicht, wann der BarChart ausgelegt ist. Ich habe eine Bearbeitung zu meiner Frage hinzugefügt – Arnold