JavaFX устанавливает BarChart xAxis / width в размер - PullRequest
0 голосов
/ 23 февраля 2020

Я хочу изменить размер X моего BarChart, но не могу. Есть ли способ реализовать это? Может быть, переписав функцию в BarChart?

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

1 Ответ

1 голос
/ 24 февраля 2020

По умолчанию ширина минимальная диаграммы представляет собой значение, рассчитанное из числа баров, минимальной ширины, необходимой для отображения каждого бара, минимальной ширины, необходимой для отображения оси 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...