JavaFX удаляет выполненное действие, если флажок не установлен - PullRequest
0 голосов
/ 06 сентября 2018

Я новичок, возиться с JavaFX. В моей программе, когда флажок установлен, я хочу, чтобы он отображал метку вместе с ChoiceBox. Однако, когда он не выбран, я хочу, чтобы оба из них исчезли. Однако я не совсем уверен, как это сделать.

Вот мой код:

String [] options = new String [] {"A", "B", "C", "D", "E", "F"};
CheckBox [] cbs = new CheckBox[options.length];

    for (int i = 0; i < options.length; i++){
        final CheckBox cb = cbs[i] = new CheckBox(options[i]);
        cb.selectedProperty().addListener(new ChangeListener<Boolean>() {
            @Override
            public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
                if(observable.getValue() == true){
                    ChoiceBox<Integer> choice = new ChoiceBox<>();
                    Label label = new Label("How many of the selected accounts do you have?");
                    choice.getItems().addAll(1, 2, 3, 4, 5);
                    choice.setValue(1);
                    selection.setAlignment(Pos.BOTTOM_LEFT);
                    selection.getChildren().addAll(label, choice);
                    gp.add(selection, 0, 8);
                } else if (observable.getValue() == false){
                    // remove above block if getValue() == false;
                }
            }
       });
   }

1 Ответ

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

Вам необходимо сохранить ссылку на узлы. Вы можете сделать это, добавив поля к анониму ChangeListener или добавив (эффективно) конечную локальную переменную в тело цикла.

Я не уверен, что такое selection, но использование одного и того же узла для нескольких флажков кажется плохой идеей.

В следующем примере просто добавляется / удаляется VBox, содержащий Label и ChoiceBox. Поскольку это меняет компоновку, я рекомендую вместо этого отключать узлы или менять видимость вместо добавления / удаления узлов.

@Override
public void start(Stage primaryStage) throws Exception {
    String[] options = new String[]{"A", "B", "C", "D", "E", "F"};
    GridPane grid = new GridPane();

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

        ChoiceBox<Integer> choice = new ChoiceBox<>();
        Label label = new Label("How many of the selected accounts do you have?");
        choice.getItems().addAll(1, 2, 3, 4, 5);

        VBox choiceContainer = new VBox(label, choice);

        checkBox.selectedProperty().addListener((o, oldValue, newValue) -> {
            if (newValue) {
                grid.add(choiceContainer, 1, row);
            } else {
                grid.getChildren().remove(choiceContainer);
            }
        });

        grid.add(checkBox, 0, row);
    }

    Scene scene = new Scene(grid);

    primaryStage.setScene(scene);
    primaryStage.show();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...