Как я могу добавить CheckBox в GridPane после того, как сцена уже была загружена / показана? - PullRequest
0 голосов
/ 24 мая 2019

Я пишу программу, которая сортирует список объектов Json, а затем форматирует / печатает данные в каждом объекте Json. Я создал графический интерфейс, который позволяет пользователю выбирать, какие строки JSON из объекта Json они хотели бы включить в окончательный вариант.

Для этого у меня есть кнопка, которую пользователь нажимает, чтобы загрузить HashMap из String / Checkbox Pairs, где строка - это KEY_NAME соответствующей строки JSON. Что я хочу сделать, так это после того, как сцена была загружена и отображен графический интерфейс, добавьте флажки из карты в существующий GridPane в сцене.

Я попробовал приведенную ниже версию, а также попробовал ее без повторного добавления gpane в AnchorPane. Пока что ничего не заставило сцену освежиться. Как мне это сделать?

public void addCheckboxes(GridPane gpane, AnchorPane pane, Map<String, CheckBox> map){
    Iterator it = map.entrySet().iterator();
    int row = 1, col = 0;
    while(it.hasNext()){
        Map.Entry pair = (Map.Entry) it.next();
        gpane.add((CheckBox) pair.getValue(), col, row);

        pane.getChildren().add(gpane);

        row++;
    }
}

1 Ответ

2 голосов
/ 24 мая 2019

Следующий код демонстрирует «Как добавить CheckBox в GridPane после того, как сцена уже загружена».Это также mcve , который вы можете использовать в качестве справочного материала для будущих вопросов (1) .

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;

public class FxMain extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{

        Button add = new Button("Add Check boxes");

        GridPane gpane = new GridPane();
        gpane.setHgap(10); gpane.setVgap(10);
        String[] strings = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J"};
        add.setOnAction(e-> {
            addCheckboxes(gpane, strings, 3);
        });

        BorderPane root = new BorderPane(gpane);
        root.setBottom(add);
        primaryStage.setScene(new Scene(root, 150,150));
        primaryStage.show();
    }

    private void addCheckboxes(GridPane gpane, String[] strings, int colums){
        int row = 0, col = 0;

        for(String s: strings){
            gpane.add(new CheckBox(s), col, row);
            col = ++col % colums;
            row = col == 0 ? ++row : row;
        }
    }

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

Если вам нужна карта для ссылки на объект CheckBox s, вы можете addCheckboxes вернуть такую ​​карту:

private Map<String, CheckBox> addCheckboxes(GridPane gpane, String[] strings, int colums){

    Map<String, CheckBox> map = new HashMap<>();

    int row = 0, col = 0;
    for(String s: strings){
        CheckBox checkBox = new CheckBox(s);    
        gpane.add(checkBox, col, row);
        map.put(s, checkBox);

        col = ++col % colums;
        row = col == 0 ? ++row : row;
    }

    return map;
}



(1) Политика SO:«Вопросы, требующие помощи в отладке (« почему этот код не работает? ») Должны включать желаемое поведение, конкретную проблему или ошибку и самый короткий код, необходимый для его воспроизведения в самом вопросе ...»
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...