JavaFX BarChart xAxis标记错误的定位

我的窗口有以下控制器:

package window; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.chart.BarChart; import javafx.scene.chart.CategoryAxis; import javafx.scene.chart.NumberAxis; import javafx.scene.chart.XYChart; import java.util.Map; import java.util.SortedMap; public class StatisticsController { @FXML private BarChart barChartHistogram; private SortedMap _points; @FXML private CategoryAxis xAxis; @FXML private NumberAxis yAxis; public void onLoad(SortedMap points) { xAxis.setLabel("Numer indeksu"); yAxis.setLabel("Ilość punktów"); //barChartHistogram.setBarGap(0); XYChart.Series series1 = new XYChart.Series(); int a = 10; series1.getData().add(new XYChart.Data("Tom", 10)); series1.getData().add(new XYChart.Data("Andrew", 7)); series1.getData().add(new XYChart.Data("Patrick", 5)); /*for (Map.Entry p: points.entrySet()) { series1.getData().add(new XYChart.Data(Integer.toString(a), p.getValue())); a += 10; }*/ barChartHistogram.getData().addAll(series1); _points = points; } } 

此窗口的.fxml文件:

                  

除了一件事,一切都很完美:

在此处输入图像描述

你可以看到x轴标签工作正常,但x轴标签(我的意思是像列名),应该是TomAndrewPatrick放在完全相同的位置(通过这个混乱,你实际上可以阅读Patrick )一个x轴的0位置。 哪里有问题? 我应该对UI进行一些更改吗?

如果动态设置数据,则属于CategoryAxis 自动范围的错误 。

下面是一个(非fxml)示例,它演示了粗暴的问题:手动设置类别而不是让图表/轴找到它们。

 public class BarChartBug extends Application { private NumberAxis yAxis; private CategoryAxis xAxis; private BarChart barChart; private Parent createContent() { xAxis = new CategoryAxis(); yAxis = new NumberAxis(); barChart = new BarChart<>(xAxis, yAxis); Button initData = new Button("init"); initData.setOnAction(e -> { xAxis.setLabel("Numer indeksu"); yAxis.setLabel("Ilo punktw"); XYChart.Series series1 = new XYChart.Series<>(); series1.getData().add(new XYChart.Data("Tom", 10)); series1.getData().add(new XYChart.Data("Andrew", 7)); series1.getData().add(new XYChart.Data("Patrick", 5)); // hack-around: // xAxis.setCategories(FXCollections.observableArrayList("Tom", "Andrew", "Patrick")); barChart.getData().addAll(series1); initData.setDisable(true); }); BorderPane pane = new BorderPane(barChart); pane.setBottom(initData); return pane; } @Override public void start(Stage stage) throws Exception { stage.setScene(new Scene(createContent())); stage.setTitle(FXUtils.version()); stage.show(); } public static void main(String[] args) { launch(args); } @SuppressWarnings("unused") private static final Logger LOG = Logger .getLogger(BarChartBug.class.getName()); }