我有代码生成的网格。我根据从服务器获取的数据生成列和行。我将包含Label(在顶部)和ImageView(在底部)的VBox附加到每个单元格。每个VBox不同。我将每个VBox视为容器。我想使每个VBox在单选按钮行为中都可以选择-只能在网格窗格中选择一个。这是我的代码,用于生成gridpane并生成VBoxes并将它们附加到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);
}
代码需要清理,在弄清楚如何使每个单元格在单选按钮行为中可点击之后,我将进行清理。
我在想,也许我应该为选定的变量创建VBox变量,然后检查它是否已经有价值,是否确实有价值,然后单击另一个VBox,然后将其更改为被单击的变量。但是我还必须让用户知道他选择了一个vbox并更改了它的背景色或类似颜色。而且我也不知道如何将每个单元格创建为可点击的。
答案 0 :(得分:2)
我完全按照我的想法去做。
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;");
}
});
}
我通过在每个vbox上设置单击侦听器来对handle方法进行覆盖,然后检查是否已单击一个vbox,是否未更改它的背景以及是否已经覆盖,然后覆盖了该变量。