JavaFX создает поведение радиокнопок в сетке VBox-es - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть код сгенерированный gridpane.Я генерирую столбцы и строки на основе данных, которые он получает с сервера.Я добавляю VBox, который содержит Label (вверху) и ImageView (внизу) к каждой ячейке.Каждый VBox отличается.Я смотрю на каждый VBox как контейнер.Я хотел бы сделать каждый VBox доступным для выбора в режиме радиокнопок - можно выбрать только один в области сетки.Это мой код для генерации gridpane и генерации VBox и добавления их к ячейкам gridpane:

private void vBoxPickPane(List<Data> data){
    int columns = 3;
    int vBoxSpacing = 2;
    int cellWidth = 260;
    int cellHeight = 220;
    List<Label> labels = new ArrayList<Label>();
    List<ImageView> imageViews = new ArrayList<>();
    List<VBox> vBoxes = new ArrayList<>();

    for(int l=0; l != data.size(); l++){
        labels.add(new Label(data.get(l).getName()));
        imageViews.add(new ImageView(new Image(new File(data.get(l).getImgFileUrl()).toURI().toString())));
    }

    int labelIndex = 0;
    for(int u=0;u!=columns;u++){
        gridPane.getColumnConstraints().add(new ColumnConstraints(cellWidth));
    }

    for(int i=0; i <= data.size()/columns; i++){
        gridPane.getRowConstraints().add(new RowConstraints(cellHeight));
    }

    for(int i=0; i<data.size();i++){
        vBoxes.add(new VBox(vBoxSpacing));
        GridPane.setConstraints(vBoxes.get(i), i%columns, i/columns);
    }

    for(int o=0; o != imageViews.size(); o++){
        imageViews.get(o).setFitHeight(200);
        imageViews.get(o).setFitWidth(255);
    }

    for(int k = 0; k != labels.size(); k++){
        labels.get(k).setStyle("-fx-background-color:white;");
    }

    for(int u = 0; u != vBoxes.size(); u++){
        vBoxes.get(u).getChildren().addAll(labels.get(u), imageViews.get(u));
    }
    gridPane.getChildren().addAll(vBoxes);

}

Код требует очистки, которую я сделаю после того, как выясню, как сделать каждую ячейку кликабельной в radiobuttonповедение.

Я думал, что, возможно, мне следует создать переменную VBox для выбранной, а затем проверить, имеет ли она уже значение, и если она действительно имеет значение, а другой VBox щелкают, то он изменится на тот, который нажал,Но я также должен сообщить пользователю, что он выбрал один vbox и изменить его цвет фона или что-то подобное.Также я не знаю, как бы я создал каждую ячейку как кликабельную.

1 Ответ

0 голосов
/ 28 февраля 2019

Я сделал это точно так, как я думал.

    for(int u = 0; u != vBoxes.size(); u++){
        final VBox curr = vBoxes.get(u);
        curr.getChildren().addAll(labels.get(u), imageViews.get(u));
        curr.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                if(selectedVbox != null){
                    //odselektaj
                    selectedVbox.setStyle("-fx-background-color: #272D2D;");
                }

                selectedVbox = curr;
                selectedVbox.setStyle("-fx-background-color: #e74c3c;");
            }
        });
    }

Я сделал переопределение метода handle, установив прослушиватель click для каждого vbox, а затем проверил, щелкнул ли он по одному и, если не изменился, его фони если это уже было, то я перезаписал переменную.

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