Javafx 限制条形图的宽度和大小

Javafx 限制条形图的宽度和大小,javafx,javafx-2,javafx-8,Javafx,Javafx 2,Javafx 8,我创建了一个简单的条形图示例,但我注意到条形图的大小与图表相符。如何限制尺寸?例如,我想限制宽度大小 正如我们已经讨论过的,要在每个条上设置最大宽度,我们必须在每次调整场景或图表的大小时相应地更改barGap或categoryGap 与参考问题的唯一区别是,我们必须在第一次显示图表时调整其大小 基于相同的代码,让我们创建setMaxBarWidth方法: 编辑 我已经用Platform.runLater包装了对setMaxBarWidth的调用,因此场景图有时间正确刷新图表,避免在while循环

我创建了一个简单的条形图示例,但我注意到条形图的大小与图表相符。如何限制尺寸?例如,我想限制宽度大小

正如我们已经讨论过的,要在每个条上设置最大宽度,我们必须在每次调整场景或图表的大小时相应地更改barGap或categoryGap

与参考问题的唯一区别是,我们必须在第一次显示图表时调整其大小

基于相同的代码,让我们创建setMaxBarWidth方法:

编辑


我已经用Platform.runLater包装了对setMaxBarWidth的调用,因此场景图有时间正确刷新图表,避免在while循环期间进行多次重新绘制。此外,我已将侦听器移动到bc.widthProperty,以防图表嵌入到其他容器中。

您的示例很好,但我需要描述一个小问题。我有一个拆分窗格,其中有一个用于保存图表的VBox。每次考试我都有旧的结果。但是当我拖动SplitPane时,我得到了想要的结果。看起来宽度计算不正确。你知道我如何在第一次加载时做到这一点吗?你需要倾听VBox宽度的变化,因此每次调整其大小时,条形图宽度也会重新计算。我测试过完全删除VBox并直接将图表插入SplitPane,但仍然没有解决方案。请检查我的编辑,现在,它应该在SplitPane中的VBox中工作。根据javadoc:runLater,在将来某个未指定的时间在JavaFX应用程序线程上运行指定的Runnable。这样可以避免多次重新绘制图表。
private final NumberAxis yAxis = new NumberAxis();
private final CategoryAxis xAxis = new CategoryAxis();
private final BarChart<String,Number> bc = new BarChart<>(xAxis,yAxis);

private void setMaxBarWidth(double maxBarWidth, double minCategoryGap){
    double barWidth=0;
    do{
        double catSpace = xAxis.getCategorySpacing();
        double avilableBarSpace = catSpace - (bc.getCategoryGap() + bc.getBarGap());
        barWidth = (avilableBarSpace / bc.getData().size()) - bc.getBarGap();
        if (barWidth >maxBarWidth){
            avilableBarSpace=(maxBarWidth + bc.getBarGap())* bc.getData().size();
            bc.setCategoryGap(catSpace-avilableBarSpace-bc.getBarGap());
        }
    } while(barWidth>maxBarWidth);

    do{
        double catSpace = xAxis.getCategorySpacing();
        double avilableBarSpace = catSpace - (minCategoryGap + bc.getBarGap());
        barWidth = Math.min(maxBarWidth, (avilableBarSpace / bc.getData().size()) - bc.getBarGap());
        avilableBarSpace=(barWidth + bc.getBarGap())* bc.getData().size();
        bc.setCategoryGap(catSpace-avilableBarSpace-bc.getBarGap());
    } while(barWidth < maxBarWidth && bc.getCategoryGap()>minCategoryGap);
}
@Override 
public void start(Stage stage) {
    bc.setTitle("1");
    xAxis.setLabel("Groups");       
    yAxis.setLabel("Value");

    XYChart.Series series1 = new XYChart.Series();
    series1.setName("Groups");       
    series1.getData().add(new XYChart.Data("kk", 1));

    Scene scene  = new Scene(bc,800,600);
    bc.getData().addAll(series1);
    stage.setScene(scene);
    stage.show();

    setMaxBarWidth(40, 10);
    bc.widthProperty().addListener((obs,b,b1)->{
        Platform.runLater(()->setMaxBarWidth(40, 10));
    });
}