JavaFX在VBox-es的网格中创建单选按钮行为

时间:2019-02-28 11:55:50

标签: javafx

我有代码生成的网格。我根据从服务器获取的数据生成列和行。我将包含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并更改了它的背景色或类似颜色。而且我也不知道如何将每个单元格创建为可点击的。

1 个答案:

答案 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,是否未更改它的背景以及是否已经覆盖,然后覆盖了该变量。