我正在编写一个带有表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”列,但我看不到行中的任何复选框。
请帮忙吗?
答案 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>
并且双向绑定的回调,所以我认为最好是实现你自己的包含复选框的单元工厂,关于你的数据模型。