javaFX tableview中没有内容

时间:2018-09-29 22:23:12

标签: javafx dynamic groovy load tableview

所以我检查了另一个No content in TableView,但这没有帮助。

我有一个名为分类帐的数据库,我想将我的交易记录下来。

void buildData(){

    final ObservableList<ObservableList<String>> data = null

    try{
        //ResultSet
        ResultSet rs = sql.getTransactions(account.getValue().toString())

        /**********************************
         * 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<TableColumn.CellDataFeatures<ObservableList,String>,ObservableValue<String>>(){
                ObservableValue<String> call(TableColumn.CellDataFeatures<ObservableList, String> param) {
                    return new SimpleStringProperty(param.getValue().get(j).toString())
                }
            })

            budgetTable.getColumns().addAll(col)
        }

        /********************************
         * Data added to ObservableList *
         ********************************/
        while(rs.next()){
            //Iterate Row

            ObservableList<String> row = FXCollections.observableArrayList()
            for(int i=1 ; i<=rs.getMetaData().getColumnCount(); i++){
                //Iterate Column
                row.add(rs.getString(i))
            }
            println("Row [1] added "+row )
            data?.add(row)
        }

        //FINALLY ADDED TO TableView
        budgetTable.setItems(data)
    }catch(Exception e){
        e.printStackTrace()
        System.out.println("Error on Building Data")
    }
}

我在数据库中有5列会复原,并添加到tableview中。这些是日期,from_account,to_account,金额和注释:

mysql> show columns from ledger;
+--------------+-------------+------+-----+---------+----------------+
| Field        | Type        | Null | Key | Default | Extra          |
+--------------+-------------+------+-----+---------+----------------+
| id           | bigint(20)  | NO   | PRI | NULL    | auto_increment |
| version      | bigint(20)  | NO   |     | 1       |                |
| date         | datetime    | NO   |     | NULL    |                |
| notes        | varchar(35) | NO   |     | NULL    |                |
| amount       | double      | NO   |     | NULL    |                |
| from_account | varchar(19) | NO   |     | NULL    |                |
| to_account   | varchar(55) | YES  |     | NULL    |                |
+--------------+-------------+------+-----+---------+----------------+
7 rows in set (0.45 sec)

我没有错误,否则我将有很大的机会解决它。在这一点上,我不知道是什么问题。在构建时只说“表中没有内容”。该文件是一个时髦的文件,所以这就是为什么它看起来像python语法的原因。

在此先感谢您的帮助,时间和见解! 保持健康!

1 个答案:

答案 0 :(得分:0)

我对Groovy不太熟悉,但我相信我知道问题所在。首先,您将data声明为final,然后将null分配给它。

final ObservableList<ObservableList<String>> data = null;

这意味着将null设置为TableView的项目。基本上,您是在呼叫budgetTable.setItems(null)。您通常不会达到这一点,因为调用data.add(row)会抛出一个NullPointerException。除非您不使用data.add(row),而是使用data?.add(row)?safe navigation operator

  

安全导航运算符用于避免出现NullPointerException。通常,当您引用一个对象时,在访问该对象的方法或属性之前,可能需要验证该对象不是null。为了避免这种情况,安全导航操作员将只返回null而不是抛出异常...

有关更多信息,请参见this question

给出所有这些,只需更改即可:

final ObservableList<ObservableList<String>> data = null;

收件人:

final ObservableList<ObservableList<String>> data = FXCollections.observableArrayList();

应该解决您的问题。