2017-03-23 93 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

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