По умолчанию ширина минимальная диаграммы представляет собой значение, рассчитанное из числа баров, минимальной ширины, необходимой для отображения каждого бара, минимальной ширины, необходимой для отображения оси y, и других такие настройки, как отступы и поля. Минимальная ширина вашей диаграммы больше 20, поэтому, когда вы устанавливаете максимальную ширину равной 20, возникает конфликт между минимальной и максимальной шириной (оба эти ограничения не могут быть выполнены одновременно). В этом случае диаграмма выбирает соблюдение минимальной ширины над максимальной шириной, поэтому вы видите ширину диаграммы в минимуме, допустимом для ее вычисленной ширины.
Вы можете разрешить соблюдение любой максимальной ширины с помощью установка минимальной ширины на ноль. В следующем изменении вашего кода вы получите диаграмму шириной 20 (но учтите, что этого места недостаточно для отображения полос, поэтому все, что вы увидите, это ось y):
@Override
public void start(Stage primaryStage) throws Exception {
CategoryAxis xAxis = new CategoryAxis();
NumberAxis yAxis = new NumberAxis();
BarChart<String, Number> chart = new BarChart<>(xAxis,yAxis);
chart.setLegendVisible(false);
root.getChildren().add(chart);
chart.setBarGap(5);
chart.setCategoryGap(0);
chart.setMinWidth(0);
chart.setMaxWidth(20);
XYChart.Series series1 = new XYChart.Series();
XYChart.Data barA = new XYChart.Data("A", 100);
XYChart.Data barB = new XYChart.Data("B", -100);
series1.getData().addAll(barA, barB);
chart.getData().addAll(series1);
Scene scene = new Scene(root, 400, 200);
primaryStage.setScene(scene);
primaryStage.setHeight(600);
primaryStage.setWidth(400);
primaryStage.show();
}
Если вы просто хотите изменить размер диаграммы вместе с окном, VBox
сделает это по умолчанию, поэтому для этого вам нужно только установить минимальную ширину на ноль:
chart.setMinWidth(0);
// chart.setMaxWidth(20);