JavaFX - 不同类型的 table 列的列表
JavaFX - List of table colum of different type
我需要创建一个 table 具有:editable 不同类型的单元格和列。
例如,一个 table 具有:两个字符串列,一个 int 类型的列和一个 date 类型的列。例如,带有日期的列应该显示日期选择器。一个字符串列必须显示一个文本字段,另一个字符串列应显示一个选项列表。
但是,以后的列会变得很多,所以我决定创建一个方法,从包含数据的数据库中获取类型和列名,并动态创建列。
这是代码。
private String tableName;
private ObservableList<TableColumn<Model, T>> cols = FXCollections.observableArrayList();
public Colonne(String tableName) {
this.tableName = tableName;
}
public ObservableList<TableColumn<Model, T>> Apply() {
try {
Connection conn = Driver.connection();
conn = DriverManager.getConnection("jdbc:mysql://"+Driver.getIP()+":"+Driver.getPort()+"/"+Driver.getDatabase()+"?autoReconnect="+Driver.getAutoReconnect()+"&useSSL="+Driver.getUseSSL()+"",
Driver.getUser(), Driver.getPassword());
conn.createStatement();
ResultSet rs = conn.getMetaData().getColumns(null, null, tableName, null);
while(rs.next()) {
if(!rs.getString("COLUMN_NAME").equals("NUMERO_AZIENDALE") && !rs.getString("COLUMN_NAME").equals("BOLO") && !rs.getString("COLUMN_NAME").equals("MARCHIO"))
switch (rs.getString("TYPE_NAME")) {
case "VARCHAR":
cols.add((TableColumn<Model, T>) new TableColumn<Model, String>(rs.getString("COLUMN_NAME").replaceAll("_", " ")));
break;
case "DATE":
cols.add((TableColumn<Model, T>) new TableColumn<Model, LocalDate>(rs.getString("COLUMN_NAME").replaceAll("_", " ")));
break;
case "INT":
cols.add((TableColumn<Model, T>) new TableColumn<Model, Number>(rs.getString("COLUMN_NAME").replaceAll("_", " ")));
break;
}
}
conn.close();
} catch (SQLException e) {
new FxDialogs().showException("Impossibile Verificare i Dati", getClass().getSimpleName(), "2", e);
}
return cols;
}
但现在我不能,或者更确切地说,我不知道如何使用这两种方法:setCellFactory 和 setCellValueFactory 来查看数据和编辑单元格,因为显然单元格的数据类型是未定义(只看上面的代码)。
实际上,通过尝试 table.getColumns().get(index).setCellValueFactory (...);方法,java 不识别类型。
作为我想出的最直观和最简单的解决方案,它是使用一种类型的列,例如字符串并仍然查看日期选择器等。可能吗?
有没有更好的解决办法?还是我必须声明任何列?
我希望我说清楚了,我很抱歉我的英语不好。
这样解决了
private String tableName;
private TableView<Model> table;
public Colonne(String tableName, TableView<Model> table) {
this.tableName = tableName;
this.table = table;
}
public void Apply() {
try {
Connection conn = Driver.connection();
conn = DriverManager.getConnection("jdbc:mysql://"+Driver.getIP()+":"+Driver.getPort()+"/"+Driver.getDatabase()+"?autoReconnect="+Driver.getAutoReconnect()+"&useSSL="+Driver.getUseSSL()+"",
Driver.getUser(), Driver.getPassword());
conn.createStatement();
ResultSet rs = conn.getMetaData().getColumns(null, null, tableName, null);
while(rs.next()) {
if(!rs.getString("COLUMN_NAME").equals("NUMERO_AZIENDALE") && !rs.getString("COLUMN_NAME").equals("BOLO") && !rs.getString("COLUMN_NAME").equals("MARCHIO"))
switch (rs.getString("TYPE_NAME")) {
case "VARCHAR":
TableColumn<Model, String> columnS = new TableColumn<Model, String>(rs.getString("COLUMN_NAME").replaceAll("_", " "));
if(!rs.getString("COLUMN_NAME").equalsIgnoreCase("STATO VISITA"))
columnS.setCellFactory(col -> new StringCell());
else
columnS.setCellFactory(col -> new ComboBoxCell());
table.getColumns().add(columnS);
break;
case "DATE":
TableColumn<Model, LocalDate> columnD = new TableColumn<Model, LocalDate>(rs.getString("COLUMN_NAME").replaceAll("_", " "));
if(rs.getString("COLUMN_NAME").equalsIgnoreCase("DATA PREVISTA PARTO"))
columnD.setCellFactory(col -> new LocalDateDataPrevistaCell());
else
columnD.setCellFactory(col -> new LocalDateCell());
table.getColumns().add(columnD);
break;
case "INT":
TableColumn<Model, Number> columnN = new TableColumn<Model, Number>(rs.getString("COLUMN_NAME").replaceAll("_", " "));
if(!rs.getString("COLUMN_NAME").contains("ID"))
columnN.setCellFactory(col -> new NumberCell());
table.getColumns().add(columnN);
break;
}
}
conn.close();
} catch (SQLException e) {
new FxDialogs().showException("Impossibile Trovare le Colonne", getClass().getSimpleName(), "1", e);
}
}
我需要创建一个 table 具有:editable 不同类型的单元格和列。
例如,一个 table 具有:两个字符串列,一个 int 类型的列和一个 date 类型的列。例如,带有日期的列应该显示日期选择器。一个字符串列必须显示一个文本字段,另一个字符串列应显示一个选项列表。
但是,以后的列会变得很多,所以我决定创建一个方法,从包含数据的数据库中获取类型和列名,并动态创建列。
这是代码。
private String tableName;
private ObservableList<TableColumn<Model, T>> cols = FXCollections.observableArrayList();
public Colonne(String tableName) {
this.tableName = tableName;
}
public ObservableList<TableColumn<Model, T>> Apply() {
try {
Connection conn = Driver.connection();
conn = DriverManager.getConnection("jdbc:mysql://"+Driver.getIP()+":"+Driver.getPort()+"/"+Driver.getDatabase()+"?autoReconnect="+Driver.getAutoReconnect()+"&useSSL="+Driver.getUseSSL()+"",
Driver.getUser(), Driver.getPassword());
conn.createStatement();
ResultSet rs = conn.getMetaData().getColumns(null, null, tableName, null);
while(rs.next()) {
if(!rs.getString("COLUMN_NAME").equals("NUMERO_AZIENDALE") && !rs.getString("COLUMN_NAME").equals("BOLO") && !rs.getString("COLUMN_NAME").equals("MARCHIO"))
switch (rs.getString("TYPE_NAME")) {
case "VARCHAR":
cols.add((TableColumn<Model, T>) new TableColumn<Model, String>(rs.getString("COLUMN_NAME").replaceAll("_", " ")));
break;
case "DATE":
cols.add((TableColumn<Model, T>) new TableColumn<Model, LocalDate>(rs.getString("COLUMN_NAME").replaceAll("_", " ")));
break;
case "INT":
cols.add((TableColumn<Model, T>) new TableColumn<Model, Number>(rs.getString("COLUMN_NAME").replaceAll("_", " ")));
break;
}
}
conn.close();
} catch (SQLException e) {
new FxDialogs().showException("Impossibile Verificare i Dati", getClass().getSimpleName(), "2", e);
}
return cols;
}
但现在我不能,或者更确切地说,我不知道如何使用这两种方法:setCellFactory 和 setCellValueFactory 来查看数据和编辑单元格,因为显然单元格的数据类型是未定义(只看上面的代码)。
实际上,通过尝试 table.getColumns().get(index).setCellValueFactory (...);方法,java 不识别类型。
作为我想出的最直观和最简单的解决方案,它是使用一种类型的列,例如字符串并仍然查看日期选择器等。可能吗?
有没有更好的解决办法?还是我必须声明任何列?
我希望我说清楚了,我很抱歉我的英语不好。
这样解决了
private String tableName;
private TableView<Model> table;
public Colonne(String tableName, TableView<Model> table) {
this.tableName = tableName;
this.table = table;
}
public void Apply() {
try {
Connection conn = Driver.connection();
conn = DriverManager.getConnection("jdbc:mysql://"+Driver.getIP()+":"+Driver.getPort()+"/"+Driver.getDatabase()+"?autoReconnect="+Driver.getAutoReconnect()+"&useSSL="+Driver.getUseSSL()+"",
Driver.getUser(), Driver.getPassword());
conn.createStatement();
ResultSet rs = conn.getMetaData().getColumns(null, null, tableName, null);
while(rs.next()) {
if(!rs.getString("COLUMN_NAME").equals("NUMERO_AZIENDALE") && !rs.getString("COLUMN_NAME").equals("BOLO") && !rs.getString("COLUMN_NAME").equals("MARCHIO"))
switch (rs.getString("TYPE_NAME")) {
case "VARCHAR":
TableColumn<Model, String> columnS = new TableColumn<Model, String>(rs.getString("COLUMN_NAME").replaceAll("_", " "));
if(!rs.getString("COLUMN_NAME").equalsIgnoreCase("STATO VISITA"))
columnS.setCellFactory(col -> new StringCell());
else
columnS.setCellFactory(col -> new ComboBoxCell());
table.getColumns().add(columnS);
break;
case "DATE":
TableColumn<Model, LocalDate> columnD = new TableColumn<Model, LocalDate>(rs.getString("COLUMN_NAME").replaceAll("_", " "));
if(rs.getString("COLUMN_NAME").equalsIgnoreCase("DATA PREVISTA PARTO"))
columnD.setCellFactory(col -> new LocalDateDataPrevistaCell());
else
columnD.setCellFactory(col -> new LocalDateCell());
table.getColumns().add(columnD);
break;
case "INT":
TableColumn<Model, Number> columnN = new TableColumn<Model, Number>(rs.getString("COLUMN_NAME").replaceAll("_", " "));
if(!rs.getString("COLUMN_NAME").contains("ID"))
columnN.setCellFactory(col -> new NumberCell());
table.getColumns().add(columnN);
break;
}
}
conn.close();
} catch (SQLException e) {
new FxDialogs().showException("Impossibile Trovare le Colonne", getClass().getSimpleName(), "1", e);
}
}