2017-03-23 134 views
0

所以,首先創建一個動態的tableview,我的代碼是基於this thread.JavaFX的:與泛型類型

接受的答案,我試圖創建從數據庫中的tableview,這tableview中應該填充動態地基於用戶要求的數據。雖然目前爲止工作正常,但我的問題是,從數據庫收集的所有值都被解釋爲java中的字符串,但我需要它們的實際值。

原因是javafx tableview的內置排序機制將所有數字都排序爲字符串,因爲它們的類型在填充表時被轉換爲字符串。

實施例: 值 921,200,110,1,2011年,1299 將被分類爲(使用整數數據類型)1,110,200,921,1299,2011 而將它分類爲1, 110,1299,200,2011,921使用字符串數據類型。

我對一般的泛型和java相當陌生,希望這裏的某個人能夠幫助我。

基本上:每當我從數據庫中讀取一個值時,我需要在它的實際數據類型的tableview中插入值,而不是將其轉換爲字符串。

回答

1

如果您使用ResultSet.getObject(index)來填充表格,這應該工作。根據JDBC規範中定義的標準映射,JDBC驅動程序將返回適當的對象類型(例如,int列將映射到java.lang.Integer等)。

我不特別喜歡你鏈接的代碼:它會產生很多關於類型安全性的警告,你應該注意。我會用這樣的事情(警告:未測試):

數據包裝類:

public class DataResult { 

    private final List<String> columnNames ; 
    private final List<List<Object>> data ; 

    public DataResult(List<String> columnNames, List<List<Object>> data) { 
     this.columnNames = columnNames ; 
     this.data = data ; 
    } 

    public int getNumColumns() { 
     return columnNames.size(); 
    } 

    public String getColumnName(int index) { 
     return columnNames.get(index); 
    } 

    public int getNumRows() { 
     return data.size(); 
    } 

    public Object getData(int column, int row) { 
     return data.get(row).get(column); 
    } 

    public List<List<Object>> getData() { 
     return data ; 
    } 
} 

數據庫訪問類:

public class DAO { 

    private Connection conn ; 


    public DAO() { 
     // initialize connection... 
    } 

    public DataResult getAllData() throws SQLException { 

     List<List<Object>> data = new ArrayList<>(); 
     List<String> columnNames = new ArrayList<>(); 

     try (
       Statement stmt = conn.createStatement(); 
       ResultSet rs = stmt.executeQuery("select * from some_table")) { 


      int columnCount = rs.getMetaData().getColumnCount(); 

      for (int i = 1 ; i <= columnCount ; i++) { 
       columnNames.add(rs.getMetaData().getColumnName(i)); 
      } 

      while (rs.next()) { 
       List<Object> row = new ArrayList<>(); 
       for (int i = 1 ; i <= columnCount ; i++) { 
        row.add(rs.getObject(i)); 
       } 
       data.add(row); 
      } 
     } 

     return new DataResult(columnNames, data); 
    } 
} 

GUI代碼:

TableView<List<Object>> table = new TableView<>(); 
DAO dao = new DAO(); 
DataResult data = dao.getAllData(); 

for (int i = 0 ; i < data.getNumColumns() ; i++) { 
    TableColumn<List<Object>, Object> column = new TableColumn<>(data.getColumnName(i)); 
    int columnIndex = i ; 
    column.setCellValueFactory(cellData -> 
     new SimpleObjectProperty<>(cellData.getValue().get(columnIndex))); 
    table.getColumns().add(column); 
} 

table.getItems().setAll(data.getData()); 

使用此版本時,提供給表的數據包含列的適當類型的對象 - 不一定是字符串。因此,例如,如果使用(SQL)類型int定義數據庫列,那麼表視圖列將包含java.lang.Integer實例,並且排序將根據Integer.compareTo(...)的實現(即,以正確的數字順序)。

+0

非常感謝,這正是我一直在尋找的。它的功能就像一個魅力,它比我之前使用的代碼更有意義。我試圖遵循mvc設計模式,而且我對它的工作方式仍然很陌生。你會如何建議我對這段代碼進行分類? –

+0

這是DAO模式的實現(鬆散地)。在MVC中,您將使DAO成爲模型的一部分,並且控制器會引用模型以獲取數據(模型委託給DAO)。 –

+0

好的,那就是我的想法。好的,再次感謝! –