2016-11-07 139 views
0

我需要创建一个表格:可编辑单元格和不同类型的列。JavaFX - 不同类型的表格列表

例如,一个包含两个字符串列,一个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(...);获得(index).setCellValueFactory(...)。方法,java不能识别类型。

作为我提出的最直观,最简单的解决方案,它使用一种类型的列,例如字符串,并仍然查看日期选择器等。是否可能?

有没有更好的解决方案?还是我必须申报任何专栏?

我希望我很清楚,我很抱歉我的英语不好。

回答

0

解决这样

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