2017-07-06 3 views
0

En fait, je veux ajouter une case à cocher à cette vue de la table qui se développe dynamiquement et à l'aide d'une case à cocher je veux supprimer les données de la base de données. Comment ajouter une case à cocher dans cette table dynamique. Merci à l'avanceJe veux ajouter une case à cocher dans la vue table qui se développe dynamiquement et effectuer des opérations dans javafx

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(); 
    } 

} 

Répondre

0

d'abord, il est tout à fait mauvaise idée de mélanger toutes les choses, comme la classe principale avec le contrôleur, et ne pas utiliser est également une mauvaise pratique fichier .fxml (s), mais, la solution à votre problème est que vous devez définir un cellFactory à votre colonne que vous voulez être la colonne «marquer pour supprimer» ou «supprimer». Ainsi, par exemple de cette façon après la boucle:

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); 

Ensuite, vous devez faire le éditable de cette façon tableView: tableView.setEditable(true);. Cela rend la table entière modifiable, si vous voulez être éditable juste la dernière colonne que vous pouvez simplement mettre dans votre boucle for col.setEditable(false);

P.S. aussi une mauvaise pratique n'utilisant pas une classe de modèle séparée pour contenir les données des lignes, et une autre mauvaise pratique n'utilisant pas de génériques par exemple à TableView<here you should put the type of your model>