我正在编写一个JavaFX 应用程序。我有一个 TableView
,其中包含数据库中的所有条目,填充如下:
public class AdvertisementListController {
@FXML public TableView<Advertisement> advertisementTable;
@FXML public TableColumn<Advertisement, String> dateColumn;
@FXML public TableColumn<Advertisement, String> productColumn;
@FXML public TableColumn<Advertisement, String> vendorColumn;
@FXML public TableColumn<Advertisement, Integer> priceColumn;
@FXML public TableColumn<Advertisement, Integer> quantityColumn;
// ...
public void initialize() {
dateColumn.setCellValueFactory(new PropertyValueFactory<>("stringDate"));
productColumn.setCellValueFactory(new PropertyValueFactory<>("productName"));
vendorColumn.setCellValueFactory(new PropertyValueFactory<>("vendorId"));
priceColumn.setCellValueFactory(new PropertyValueFactory<>("price"));
quantityColumn.setCellValueFactory(new PropertyValueFactory<>("quantity"));
// ...
AdvertisementDAO advertisementDAO = new AdvertisementDAO();
annunciTable.setItems(advertisementDAO.getAdvertisementObservableList());
}
从应用程序的另一个窗口,我可以在数据库表中插入新条目。我是 GoF 模式的新手,我试图在这里实现一个观察者模式以保持表格更新,但我真的不知道从哪里开始。 这里的主题是什么?什么是 Observer 类?
最佳答案
JavaFX 是一个使用模型- View - Controller (MVC) 设计模式的框架。如果您进行一些研究,您会发现 MVC 也使用 Observer
设计模式。
JavaFX 在支持Observer
设计模式方面又向前迈进了一步。 JavaFX有Property
的概念,它基本上是Observer
设计模式。 Property
对象保存值,它可用于观察值的变化。 Property
(以及ObservableList
等)的基本接口(interface)是Observable
。
因此,通过使用 Property
(在您的情况下为 ObservableList
),您已经在使用 Observer
设计模式。
因此,为了正确执行此操作,您需要以下内容:
- 确保您的
Advertisement
类存储stringDate
、productName
、vendorId
、price
和数量
作为属性
。 - 不要通过
getAdvertisementObservableList()
从AdvertisementDAO
获取ObservableList
,而是将ObservableList
移出,作为AdvertisementListController
的字段。当数据发生变化时,您应该更改ObservableList
。 - 根据其他窗口更改数据的方式,您可能还需要使用
FXCollections.observableArrayList(Callback)
重载创建ObservableList
。
示例:
public class Advertisement {
private final StringProperty stringDate = new SimpleStringProperty();
public final StringProperty stringDateProperty() { return stringDate; }
public final String getStringDate() { return stringDate.get(); }
public final void setStringDate(String s) { stringDate.set(s); }
// Other properties
}
public class AdvertisementListController {
@FXML public TableView<Advertisement> advertisementTable;
@FXML public TableColumn<Advertisement, String> dateColumn;
@FXML public TableColumn<Advertisement, String> productColumn;
@FXML public TableColumn<Advertisement, String> vendorColumn;
@FXML public TableColumn<Advertisement, Integer> priceColumn;
@FXML public TableColumn<Advertisement, Integer> quantityColumn;
private final ObservableList advertisements = FXCollections.observableArrayList(advertisement -> new Observable[] { advertisement.stringDateProperty() });
public void initialize() {
dateColumn.setCellValueFactory(new PropertyValueFactory<>("stringDate"));
productColumn.setCellValueFactory(new PropertyValueFactory<>("productName"));
vendorColumn.setCellValueFactory(new PropertyValueFactory<>("vendorId"));
priceColumn.setCellValueFactory(new PropertyValueFactory<>("price"));
quantityColumn.setCellValueFactory(new PropertyValueFactory<>("quantity"));
// ...
AdvertisementDAO advertisementDAO = new AdvertisementDAO();
advertisements.setAll(advertisementDAO.getAdvertisementList());
advertisementTable.setItems(advertisements);
}
}
关于java - 使用观察者模式保持 TableView 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47881633/