JavaFX将条形图X轴/宽度设置为大小

JavaFX将条形图X轴/宽度设置为大小,java,javafx,Java,Javafx,我想强制调整柱状图的X尺寸,但不行。有没有办法实现这一点?可能通过覆盖条形图中的函数 import com.milkyway.trader.missionControl.OptionHistorySingleton; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.chart.*; import javafx.scene.layout.VBox; import javafx

我想强制调整柱状图的X尺寸,但不行。有没有办法实现这一点?可能通过覆盖条形图中的函数

import com.milkyway.trader.missionControl.OptionHistorySingleton;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.*;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class SetBarChartBarSizeExample extends Application {

    VBox root = new VBox();

    @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);

        // Doesn't work.
        //xAxis.maxWidthProperty().bind(root.widthProperty());
        xAxis.setMaxWidth(20);
        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();
    }

    public static void main(String[] args) {
        Application.launch(args);
    }
}
默认情况下,图表的最小宽度是根据条数、显示每个条所需的最小宽度、显示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();
}

我认为你在这里设置的最大宽度小于最小宽度,所以你观察到的是最小宽度。不过,chart.setMaxWidth20肯定会产生影响。现在还不清楚你想要实现什么,但这并没有发生。你能澄清一下吗?@James_D它确实有影响,图表不会缩放超过某个宽度,但该宽度不是20px。条形图似乎在内部覆盖20px。请尝试将图表的最小宽度设置为0。
    chart.setMinWidth(0);
    // chart.setMaxWidth(20);