1

我正在编写一个带有表视图的客户端-服务器 java FX 应用程序。我在服务器端有一个数据库,我希望从客户端将表列和表记录从数据库动态加载到表视图中。到目前为止,我已经找到了许多关于如何成功执行此操作的提示。问题是我想在表格中添加一个“选择”列,这是一个复选框。下面是我的代码。

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 类。数据库成功加载到表视图中,并且创建了我的“选择”列,但我在行中看不到任何复选框。

请问有什么帮助吗?

4

1 回答 1

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>并双向绑定,所以我认为最好实现你自己的包含复选框的单元工厂,关于你的数据模型。

于 2012-12-17T12:49:48.367 回答