我正在编写 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课程是什么?
答案 0 :(得分:2)
JavaFX是一个使用模型 - 视图 - 控制器(MVC)设计模式的框架。如果你做一些研究,你会发现MVC也使用Observer
设计模式。
JavaFX更进一步支持Observer
设计模式。 JavaFX具有Property
的概念,它基本上是Observer
设计模式。 Property
对象保存该值,它可用于观察值的变化。 Property
(和ObservableList
等)的基础界面为Observable
。
因此,使用Property
(在您的情况下为ObservableList
),您已经在使用Observer
设计模式。
所以为了正确地做到这些,你需要的是:
Advertisement
班级商店stringDate
,productName
,vendorId
,price
和quantity
为Property
。< / LI>
ObservableList
通过AdvertisementDAO
获取getAdvertisementObservableList()
,而是将ObservableList
移出AdvertisementListController
作为字段。每当数据发生变化时,您应该改为ObservableList
。ObservableList
FXCollections.observableArrayList(Callback)
超载。示例:
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);
}
}