我想在动态增长的 table 视图中添加复选框并在 javafx 中执行操作

i want to add checkbox in table view which grows dynamically and perform operations in javafx

实际上我想向这个动态增长的 table 视图添加复选框,并且借助复选框我想从数据库中删除数据。如何在此动态 table 中添加复选框。 提前谢谢你

public class CheckEngineDetailMain extends Application{

//TABLE VIEW AND DATA
private ObservableList<ObservableList> data;
private TableView tableview;
//MAIN EXECUTOR
public static void main(String[] args) {
    launch(args);

}

//CONNECTION DATABASE
public void buildData(){

    Connection c ;
      data = FXCollections.observableArrayList();
      try{
        c = DBConnect.connect();

        //SQL FOR SELECTING ALL OF CUSTOMER

        String SQL = "SELECT * from Engine_Detail_test;" ;

        //ResultSet
        ResultSet rs = c.createStatement().executeQuery(SQL);

        /**********************************
         * TABLE COLUMN ADDED DYNAMICALLY *
         **********************************/
        for(int i=0 ; i<rs.getMetaData().getColumnCount(); i++){
            //We are using non property style for making dynamic table
            final int j = i;                
            TableColumn col = new TableColumn(rs.getMetaData().getColumnName(i+1));
            col.setCellValueFactory(new Callback<CellDataFeatures<ObservableList,String>,ObservableValue<String>>(){                    
                public ObservableValue<String> call(CellDataFeatures<ObservableList, String> param) {                                                                                              
                    return new SimpleStringProperty(param.getValue().get(j).toString());                        
                }                    
            });

            tableview.getColumns().addAll(col); 

            System.out.println("Column ["+i+"] ");
        }



        while(rs.next()){
            //Iterate Row
            ObservableList<String> row = FXCollections.observableArrayList();

            for(int i=1 ; i<=rs.getMetaData().getColumnCount(); i++){
                //Iterate Column
                //row.add(1, new CheckBox());
                row.add(rs.getString(i));
            }
            System.out.println("Row [1] added "+row );
            data.add(row);

        }

        //FINALLY ADDED TO TableView
        tableview.setItems(data);
      }catch(Exception e){
          e.printStackTrace();
          System.out.println("Error on Building Data");             
      }
  }


  @Override
  public void start(Stage stage) throws Exception {
    //TableView

    tableview = new TableView();
    buildData();

    //Main Scene
    Scene scene = new Scene(tableview);        

    stage.setScene(scene);
    stage.show();
  }

}

首先,混合所有东西是非常糟糕的主意,比如主 class 和控制器,不使用 .fxml 文件也是一个不好的做法,但是,您的问题的解决方案是您必须将 cellFactory 设置为您想要成为 "mark for delete" 或 "delete" 列的列。 因此,例如在 for 循环之后这样:

TableColumn col = new TableColumn("column header name you want");
col.setCellFactory(factory -> new CheckBoxTableCell());
col.setCellValueFactory(v -> {
        BooleanProperty property = new SimpleBooleanProperty();
        property.addListener((observable, oldValue, newValue) -> {
            if (newValue) {
                tableView.getItems().remove(((TableColumn.CellDataFeatures)v).getValue());
            }
        });
    return property;
});
tableView.getColumns().add(col);

那么您必须这样制作 tableView editable:tableView.setEditable(true);。这使得整个 table editable,如果你想成为 editable 只是你可以简单地放入 for 循环的最后一列 col.setEditable(false);

P.S。不使用单独的模型 class 来保存行的数据也是一个不好的做法,另一个不使用泛型的不好的做法例如 TableView<here you should put the type of your model>