Первый столбец JavaFX 1 в gridpane расположен намного дальше, чем остальные - PullRequest
0 голосов
/ 06 сентября 2018

В моей программе я пытаюсь вывести на экран HBox, заполненный CheckBoxes. Однако, когда я запускаю программу, CheckBox "A" отодвигается намного дальше по сравнению с остальными флажками.

Вот мой код:

private Scene assets (Stage primaryStage){

        GridPane gp = new GridPane();
        gp.setVgap(5);
        gp.setPadding(new Insets(25, 25, 25, 25));

        Text title = new Text("Assets");
        title.setFont(Font.font("Arial", FontWeight.BOLD, 14));
        gp.add(title, 0, 0);

        Text description = new Text("Please select all assets you would like to include in your budget");
        gp.add(description, 0, 1);

        String [] optionsString = new String []{"A", "B", "C", "D", "E", "F"};

        for (int i = 0; i < optionsString.length; i++) {
            final int column = i;
            final int row = i;
            String option = optionsString[i];
            CheckBox checkBox = new CheckBox(option);

            HBox checkboxContainer = new HBox(checkBox);
            checkboxContainer.setSpacing(20);

            ChoiceBox<Integer> choice = new ChoiceBox<>();
            Label label = new Label("How many " + optionsString[i] + " options do you have?");
            choice.getItems().addAll(1, 2, 3, 4, 5);

            HBox choiceContainer = new HBox(label, choice);

            checkBox.selectedProperty().addListener((o, oldValue, newValue) -> {
                if (newValue) {
                    gp.add(choiceContainer, 0, row + 4);
                } else {
                    gp.getChildren().remove(choiceContainer);
                }
            });
            gp.add(checkboxContainer, column, 3);
        }

        assets = new Scene (gp, 1280, 720);

        return assets;
    }

РЕДАКТИРОВАТЬ: Вот скриншот того, о чем я говорю As you can see, the

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Вы случайно устанавливаете ширину столбца 0 (первого столбца) равной ширине вашего текста: «Пожалуйста, выберите все ... и т. Д.».

Это потому, что GridPane использует предпочтительную ширину для самого большого элемента столбца в качестве ширины этого столбца.

Вы, вероятно, хотите удалить текст из GridPane и сделать его частью HBox или VBox, элементом которого также является GridPane. Это похоже на самое естественное решение.

Либо так, либо вам придется дурачиться с диапазоном текстового элемента, поэтому GridPane считает, что он должен охватывать несколько столбцов.

Грид-панели наиболее естественны для данных, которые естественно можно рассматривать как сетку, где данные каждого столбца имеют одинаковую ширину. Это не то, что у вас есть.

Тем не менее, вы можете заставить GridPane делать практически все с небольшими пробами и ошибками.

0 голосов
/ 06 сентября 2018
private Scene assets(Stage primaryStage){
                Scene assets;
                GridPane gp = new GridPane();
                gp.setVgap(0);
                //gp.setPadding(new Insets(25, 0, 25, 25));

                Text title = new Text("Assets");
                title.setFont(Font.font("Arial", FontWeight.BOLD, 14));
                gp.add(title, 0, 0);

                Text description = new Text("Please select all assets you would like to include in your budget");
                gp.add(description, 0, 1);

                String [] optionsString = new String []{"A", "B", "C", "D", "E", "F"};
                HBox checkboxContainer = new HBox();
                checkboxContainer.setPadding(new Insets(5, 5, 5, 5));
                checkboxContainer.setSpacing(20);

                for (int i = 0; i < optionsString.length; i++) {
                    final int column = i;
                    final int row = i;
                    String option = optionsString[i];
                    CheckBox checkBox = new CheckBox(option);
                    ChoiceBox<Integer> choice = new ChoiceBox<>();
                    Label label = new Label("How many " + optionsString[i] + " options do you have?");
                    choice.getItems().addAll(1, 2, 3, 4, 5);

                    HBox choiceContainer = new HBox(label, choice);

                    checkBox.selectedProperty().addListener((o, oldValue, newValue) -> {
                        if (newValue) {
                            gp.add(choiceContainer, 0, row + 4);
                        } else {
                            gp.getChildren().remove(choiceContainer);
                        }
                    });
                    checkboxContainer.getChildren().add(checkBox);
                }
                gp.add(checkboxContainer, 0, 2);

                assets = new Scene (gp, 1280, 720);

                return assets;
            }

CheckboxContainer должен быть вне цикла for.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...