JavaFX在VBox es的gridpane中创建单选按钮行为

JavaFX在VBox es的gridpane中创建单选按钮行为,javafx,Javafx,我有生成gridpane的代码。我根据从服务器获取的数据生成列和行。我将包含标签(在顶部)和图像视图(在底部)的VBox附加到每个单元格。每个VBox都是不同的。我将每个VBox视为容器。我想让每个VBox在radiobutton行为中都是可选择的-只能选择gridpane中的一个。这是我生成gridpane和生成VBox并将它们附加到gridpane中单元格的代码: private void vBoxPickPane(List<Data> data){ int column

我有生成gridpane的代码。我根据从服务器获取的数据生成列和行。我将包含标签(在顶部)和图像视图(在底部)的VBox附加到每个单元格。每个VBox都是不同的。我将每个VBox视为容器。我想让每个VBox在radiobutton行为中都是可选择的-只能选择gridpane中的一个。这是我生成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);

}
private void vBoxPickPane(列表数据){
int列=3;
int vBoxSpacing=2;
int-cellWidth=260;
内部单元高度=220;
列表标签=新的ArrayList();
List ImageView=新建ArrayList();
List vBoxes=new ArrayList();
for(int l=0;l!=data.size();l++){
labels.add(新标签(data.get(l).getName());
添加(新图像视图(新图像(新文件(data.get(l).getImgFileUrl()).toURI().toString())));
}
int labelIndex=0;
for(int u=0;u!=列;u++){
getColumnConstraints().add(新的ColumnConstraints(cellWidth));
}

对于(inti=0;i我完全按照自己的想法来做

    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;");
            }
        });
    }
for(int u=0;u!=vBoxes.size();u++){
最终VBox curr=VBox.get(u);
curr.getChildren().addAll(labels.get(u)、imageview.get(u));
curr.setOnMouseClicked(新的EventHandler(){
@凌驾
公共无效句柄(MouseeEvent事件){
if(selectedVbox!=null){
//奥德塞勒克泰姬酒店
selectedVbox.setStyle(“-fx背景色:#272D2D;”);
}
selectedVbox=当前值;
选择VBox.setStyle(“-fx背景色:#e74c3c;”);
}
});
}
我在handle方法上做了一个覆盖,在每个vbox上设置click listener,然后检查一个是否已经被单击,如果没有更改它的背景,如果已经被单击,则覆盖变量