我想在动态增长的 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>
实际上我想向这个动态增长的 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>