在javaFX 2.2表视图中动态添加数据库中的复选框和记录

时间:2012-12-17 11:15:54

标签: checkbox tableview javafx-2

我正在编写一个带有表View的客户端 - 服务器java FX应用程序。我在服务器端有一个数据库,我想从客户端加载表列和表记录从数据库到表动态查看。到目前为止,我已经找到了很多提示,关于如何成功地做到这一点。问题是我想在表中添加一个“select”列,这是一个复选框。以下是我的代码。

private void AddToTableRecordsFromDB(TabPane tp){
    tableview = (TableView) tp.lookup("#table");
    ObservableList<Object> data = null;
    try {
        String[] columnNames = (String[]) Login.Login.in.readObject();
        ArrayList<ArrayList> al = (ArrayList<ArrayList>) Login.Login.in.readObject();
        /**********************************
         * TABLE COLUMN ADDED DYNAMICALLY *
         **********************************/
                TableColumn select = new TableColumn("Select");
                select.setCellValueFactory(new PropertyValueFactory("invited"));
                select.setCellFactory(new Callback<TableColumn<ObservableValue, Boolean>, TableCell<ObservableValue, Boolean>>() {

                    public TableCell<ObservableValue, Boolean> call(TableColumn<ObservableValue, Boolean> p) {
                        return new CheckBoxTableCell<ObservableValue, Boolean>();
                    }
                });
                tableview.getColumns().add(select);

        for(int i=0 ; i<columnNames.length; i++){
            //use non property style for making dynamic table
            final int j = i;  
            TableColumn col;
                col = new TableColumn(columnNames[i]);
                col.setCellValueFactory(new Callback<CellDataFeatures<ObservableList,String>,ObservableValue<String>>(){                   
                    @Override
                    public ObservableValue<String> call(CellDataFeatures<ObservableList, String> param) {                                                                                             
                        return new SimpleStringProperty(param.getValue().get(j).toString());                     
                    }                   
                });                  

            tableview.getColumns().add(col);
        }
        /********************************
         * Data added to ObservableList *
         ********************************/
        data = FXCollections.observableArrayList();

        for(int i=0 ; i<al.size(); i++){
            ObservableList<ArrayList> row = FXCollections.observableArrayList(al.get(i));
            data.add(row);
        }
        //FINALLY ADDED TO TableView
        tableview.setItems(data);

    } catch (IOException | ClassNotFoundException ex) {
        Logger.getLogger(Developer_Main.class.getName()).log(Level.SEVERE, null, ex);
    } 

}

我从JavaFX2.0 Ensemble中获取了CheckBoxTableCell类。 数据库成功加载到表视图中,并且还创建了“select”列,但我看不到行中的任何复选框。

请帮忙吗?

1 个答案:

答案 0 :(得分:0)

您说您正在使用“非属性样式”动态添加列,并且您的表视图由列表项列表组成。我猜这些数据结构模型中没有getInvited()方法。但是,通过设置select.setCellValueFactory(new PropertyValueFactory("invited"));,表列将查找该方法。将单元格值工厂设置为有效值。

编辑:我没有测试,但您可以尝试下面的代码。

select.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ObservableList, String>, ObservableValue<String>>() {
    public ObservableValue<String> call(TableColumn.CellDataFeatures<ObservableList, String> p) {
        return new SimpleStringProperty(p.getValue().get(0).toString());
    }
});

请注意get(0)。也就是说,如果readObject()返回至少1个项目会更好。另一个注意事项是CheckBoxTableCell需要一个返回ObservableProperty<Boolean>并且双向绑定的回调,所以我认为最好是实现你自己的包含复选框的单元工厂,关于你的数据模型。