【问题标题】:How to set category gap in relative units in Java FX?如何在 Java FX 中以相对单位设置类别差距?
【发布时间】:2016-10-03 12:35:59
【问题描述】:

假设我想在条形之间设置一个与条形大小相同的间隙。如果单位是百分比,我会设置100。但这不起作用:

public class StackedBarChart_Horizontal_Try extends Application {

    final static String itemA = "A";
    final static String itemB = "B";
    final static String itemC = "C";
    @Override
    public void start(Stage stage) {
        final NumberAxis xAxis = new NumberAxis();
        final CategoryAxis yAxis = new CategoryAxis();

        final StackedBarChart<Number, String> bc = new StackedBarChart<Number, String>(xAxis, yAxis);

        //bc.setBarGap(0);
        bc.setCategoryGap(100);




        bc.setTitle("Summary");
        xAxis.setLabel("Value");
        xAxis.setTickLabelRotation(90);
        yAxis.setLabel("Item");

        XYChart.Series series1 = new XYChart.Series();
        series1.setName("2003");
        series1.getData().add(new XYChart.Data(2, itemA));


        XYChart.Series series2 = new XYChart.Series();
        series2.setName("2004");
        series2.getData().add(new XYChart.Data(41, itemB));

        XYChart.Series series3 = new XYChart.Series();
        series3.setName("2005");
        series3.getData().add(new XYChart.Data(18, itemC));

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

    public static void main(String[] args) {
        launch(args);
    }
}

给予

并且在窗口调整大小时间隙的大小保持不变:

这意味着间隙以屏幕像素为单位设置。

如何设置轴单元大小的差距?

【问题讨论】:

    标签: java javafx bar-chart


    【解决方案1】:

    条形图的布局与您在此处要实现的目标相反:给定绘图区域的高度,布局机制首先为间隙分配空间,然后计算条形的大小基于剩余可用空间。

    因此,执行此操作的方法是将categoryGapProperty 绑定到给定条数和绘图区域高度(与 y 轴高度相同)的正确大小。要为间隙和条分配相同数量的空间,您需要将间隙等于总高度除以条数的两倍:

    bc.categoryGapProperty().bind(Bindings.createDoubleBinding(() ->
        yAxis.getHeight() / (2 * bc.getData().size()), 
        Bindings.size(bc.getData()), yAxis.heightProperty()));
    

    完整示例:

    import javafx.application.Application;
    import javafx.beans.binding.Bindings;
    import javafx.scene.Scene;
    import javafx.scene.chart.CategoryAxis;
    import javafx.scene.chart.NumberAxis;
    import javafx.scene.chart.StackedBarChart;
    import javafx.scene.chart.XYChart;
    import javafx.stage.Stage;
    
    public class StackedBarChart_Horizontal_Try extends Application {
    
        final static String itemA = "A";
        final static String itemB = "B";
        final static String itemC = "C";
        @Override
        public void start(Stage stage) {
            final NumberAxis xAxis = new NumberAxis();
            final CategoryAxis yAxis = new CategoryAxis();
    
            final StackedBarChart<Number, String> bc = new StackedBarChart<Number, String>(xAxis, yAxis);
    
            //bc.setBarGap(0);
    //        bc.setCategoryGap(100);
    
            bc.categoryGapProperty().bind(Bindings.createDoubleBinding(() ->
                yAxis.getHeight() / (2 * bc.getData().size()), 
                Bindings.size(bc.getData()), yAxis.heightProperty()));
    
    
            bc.setTitle("Summary");
            xAxis.setLabel("Value");
            xAxis.setTickLabelRotation(90);
            yAxis.setLabel("Item");
    
            XYChart.Series series1 = new XYChart.Series();
            series1.setName("2003");
            series1.getData().add(new XYChart.Data(2, itemA));
    
    
            XYChart.Series series2 = new XYChart.Series();
            series2.setName("2004");
            series2.getData().add(new XYChart.Data(41, itemB));
    
            XYChart.Series series3 = new XYChart.Series();
            series3.setName("2005");
            series3.getData().add(new XYChart.Data(18, itemC));
    
            Scene scene = new Scene(bc, 800, 600);
            bc.getData().addAll(series1, series2, series3);
            stage.setScene(scene);
            stage.show();
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    在不同的窗口大小下呈现:

    【讨论】:

    • @Dims 在某种程度上,也许是因为您正在尝试更改空间分配的优先级,而没有直接的API。 OTOH,该图表将categoryGapProperty() 公开为完全可写和可绑定的属性,因此可以公平地假设将其绑定到某物是预期的用例。这里的绑定只是以非常直接的方式表达“间隙应该始终是可用空间的一半”。
    猜你喜欢
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    相关资源
    最近更新 更多