JavaFX条形图xAxis标签定位错误

JavaFX条形图xAxis标签定位错误,java,javafx,bar-chart,Java,Javafx,Bar Chart,我的窗口有以下控制器: 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.u

我的窗口有以下控制器:

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<String, Integer> _points;

    @FXML
    private CategoryAxis xAxis;
    @FXML
    private NumberAxis yAxis;

    public void onLoad(SortedMap<String, Integer> 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<String, Integer> p: points.entrySet()) {
            series1.getData().add(new XYChart.Data<>(Integer.toString(a), p.getValue()));
            a += 10;
        }*/
        barChartHistogram.getData().addAll(series1);
        _points = points;
    }

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

正如您所看到的,x轴标签工作正常,但是x轴标签(我的意思是类似列名)应该是
Tom
Andrew
Patrick
被放置在完全相同的位置(通过这个混乱,您实际上可以读取
Patrick
)a x轴的0位置。问题在哪里?我应该对UI或其他东西做一些更改吗?

如果数据是动态设置的,则这是一个类别问题

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

public class BarChartBug extends Application {

    private NumberAxis yAxis;
    private CategoryAxis xAxis;
    private BarChart<String, Number> 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<String, Number> series1 = new XYChart.Series<>();
            series1.getData().add(new XYChart.Data<String, Number>("Tom", 10));
            series1.getData().add(new XYChart.Data<String, Number>("Andrew", 7));
            series1.getData().add(new XYChart.Data<String, Number>("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());

}
公共类BarChartBug扩展应用程序{
私人号码xis yAxis;
私有分类法;
私人条形图;
私有父createContent(){
xAxis=新类别Axis();
yAxis=新的数字Axis();
条形图=新条形图(X轴、Y轴);
按钮初始化数据=新按钮(“初始化”);
initData.setOnAction(e->{
xAxis.setLabel(“数字索引”);
yAxis.setLabel(“国际劳工组织朋克托”);
XYChart.Series系列1=新的XYChart.Series();
series1.getData().add(新的XYChart.Data(“Tom”,10));
series1.getData().add(新的XYChart.Data(“Andrew”,7));
series1.getData().add(新的XYChart.Data(“Patrick”,5));
//闲逛:
//setCategories(FXCollections.observearraylist(“汤姆”、“安德鲁”、“帕特里克”));
barChart.getData().addAll(series1);
initData.setDisable(true);
});
边框窗格=新边框窗格(条形图);
窗格.setBottom(initData);
返回窗格;
}
@凌驾
public void start(Stage)引发异常{
stage.setScene(新场景(createContent());
stage.setTitle(FXUtils.version());
stage.show();
}
公共静态void main(字符串[]args){
发射(args);
}
@抑制警告(“未使用”)
专用静态最终记录器日志=记录器
.getLogger(BarChartBug.class.getName());
}

我找到了另一种解决方法。只需设置xAxis.setAnimated(false)

这很有趣,但我在java11中也遇到了同样的问题,在我的图表数据加载后,类别标签永远不会显示。经过几次尝试后,我决定在时间轴中设置图表数据,并在完成后手动设置类别标签

Duration duration = Duration.millis(300);
Platform.runLater(()->{
    Timeline timeline = new Timeline(
        new KeyFrame(duration,event -> {
            barChart.getData().clear();
            barChart.getData().add(series1);
            barChart.getData().addAll(series2);
            //Clear all bofore to evitate Exceptions
            catAxis.getCategories().clear();                           
        })
    );
    timeline.setCycleCount(1);
    timeline.setOnFinished(event -> {
    //Set animated as false, so if true all labels will be one in top of the others 
    barChart.setAnimated(false);
    //The trick that worked forr me
    catAxis.getCategories().addAll(lists);
});
timeline.play();  });

这是一个与bug相关的动画属性,您可以:

  • 设置xAxis.setAnimated(false) 或
  • 将动画属性设置为false:

我运行了你的代码,没有问题。好的。那么它会在哪里呢?它能用Java 9而不是8吗?我用的是
Java 8
。好吧,Java 8没有帮助,它在非常类似的问题上翻滚。经过长时间的调试和尝试了几个变通方法后,我不得不承认这个问题确实是不可修复的,并且源于类中的bug。我无法理解他们怎么会错过这么明显的事情。你完全正确,事实上我自己也知道。无论如何谢谢你!这是更好的解决办法。手动设置很容易出错。非常感谢。