javafx - 将 TableView 绑定到 ObservableList
问题描述
我有一个可观察的列表保存作者对象。gui 能够将作者添加到我的数据库中。可观察列表包含数据库的所有对象。如果我在数据库中添加作者,我希望我的表自动更新。
我已经尝试使用 table.refresh() 刷新列表。我也在考虑为可观察列表使用更改侦听器。
这里是创建表的代码。authorList 是一个可观察的列表。我想我不太明白如何使用可观察列表。我的建议是,通过使用“table.setItem(authorList)”,如果列表中的某些内容发生更改,我的表格会自动更新其条目。显然,情况并非如此。
private void createAuthorsTablePane() {
// TODO: Layout ändern
GridPane authorGridPane = new GridPane();
// create table
TableView<Author> table = new TableView<>();
// Create columns with title
TableColumn<Author, String> idColumn = new TableColumn<>("ID");
TableColumn<Author, String> nameColumn = new TableColumn<>("Name");
TableColumn<Author, String> emailColumn = new TableColumn<>("Email");
TableColumn<Author, String> publicationsColumn = new TableColumn<>("Publications");
// Add columns to table node
table.getColumns().add(idColumn);
table.getColumns().add(nameColumn);
table.getColumns().add(emailColumn);
table.getColumns().add(publicationsColumn);
// Bindings
PropertyValueFactory<Author, String> idColumnFactory = new PropertyValueFactory<>("id");
PropertyValueFactory<Author, String> nameColumnFactory = new PropertyValueFactory<>("name");
PropertyValueFactory<Author, String> emailColumnFactory = new PropertyValueFactory<>("email");
PropertyValueFactory<Author, String> publicationsColumnFactory = new PropertyValueFactory<>("publications");
idColumn.setCellValueFactory(idColumnFactory);
nameColumn.setCellValueFactory(nameColumnFactory);
emailColumn.setCellValueFactory(emailColumnFactory);
publicationsColumn.setCellValueFactory(publicationsColumnFactory);
table.setItems(authorList);
// Create Buttons
createAuthorButton = new Button("Create author");
createAuthorButton.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
mainController.createAuthorController();
}
});
deleteAuthorButton = new Button("Delete selected author");
// Add Nodes to Pane
authorGridPane.add(new Label("Authors"), 0, 0);
authorGridPane.add(table, 0, 1);
authorGridPane.add(deleteAuthorButton, 0, 2);
authorGridPane.add(createAuthorButton, 1, 2);
authorPane = authorGridPane;
}
这是我创建作者列表的类。我正在使用控制器创建表的类中注册列表。
public class ObservableModel {
private ObservableList<Publication> publicationList;
private ObservableList<Author> authorList;
public ObservableModel(DatabaseService database) {
publicationList = FXCollections.observableList(database.getPublications());
authorList = FXCollections.observableList(database.getAuthors());
}
public ObservableList<Publication> getPublicationList() {
return publicationList;
}
public ObservableList<Author> getAuthorList() {
return authorList;
}
}
解决方案
TableView<Author> table = new TableView<>();
private ObservableList<Author> authorList = FXCollections.observableArrayList();
private Property<ObservableList<Author>> authorListProperty = new SimpleObjectProperty<>(authorList);
table.itemsProperty().bind(authorListProperty); // The Binding
每次更改 authorList 时,tableview 也会更新
推荐阅读
- class-diagram - PlantUML类图中两个同名的类
- keycloak - Keycloak中用户的多种身份验证方法
- javascript - 以外部剪贴蒙版的形状裁剪图像-fabric.js
- mysql - 使用插入/更新加快 SQL 处理时间
- sql-server - SQL 服务器计划缓存
- mongodb - 在 Golang 的两个不同结构字段中映射 Mongo _id
- mips - Little Endian Mips 操作
- swift - 使用 Alamofire 上传多部分表单数据显示服务器中缺少文件
- php - Woocommerce rest api 更新产品图片给出错误
- google-cloud-platform - 无法在浏览器窗口中访问谷歌云实例(我们无法连接到端口 22 上的虚拟机)