Java 使用观察者模式保持表视图的更新
我正在编写一个JavaFX应用程序。我有一个Java 使用观察者模式保持表视图的更新,java,javafx,observer-pattern,Java,Javafx,Observer Pattern,我正在编写一个JavaFX应用程序。我有一个TableView,其中包含数据库中的所有条目,填充方式如下: public class AdvertisementListController { @FXML public TableView<Advertisement> advertisementTable; @FXML public TableColumn<Advertisement, String> dateColumn; @FXML publ
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());
}
公共类AdvertisementListController{
@FXML公共表查看广告表;
@FXML公共表列dateColumn;
@FXML公共表列productColumn;
@FXML公共表列供应商列;
@FXML公共表列priceColumn;
@FXML公共表列quantityColumn;
// ...
公共无效初始化(){
dateColumn.setCellValueFactory(新属性ValueFactory(“stringDate”);
productColumn.setCellValueFactory(新的PropertyValueFactory(“productName”);
vendorColumn.setCellValueFactory(新属性ValueFactory(“vendorId”);
priceColumn.setCellValueFactory(新属性ValueFactory(“价格”));
quantityColumn.setCellValueFactory(新属性ValueFactory(“数量”);
// ...
AdvertisementDAO AdvertisementDAO=新的AdvertisementDAO();
annunciTable.setItems(advertisementDAO.getAdvertisementObservableList());
}
从我的应用程序的另一个窗口,我可以在数据库的表中插入新的条目。我对GoF模式不熟悉,我试图在这里实现一个观察者模式,以保持表的更新,但我真的不知道从哪里开始。这里的主题是什么?观察者类是什么?JavaFX是一个使用模型-视图-控制器(MVC)设计模式的框架。如果您进行一些研究,就会发现MVC也使用了
Observer
设计模式
JavaFX进一步支持了观察者
设计模式。JavaFX有属性
的概念,基本上是观察者
设计模式。一个属性
对象持有值,可以用来观察值的变化。属性
的基本接口(和可观察列表
等)是可观察的
因此,通过使用属性
(在您的例子中是可观察列表
),您已经在使用观察者
设计模式
因此,为了正确地完成这项工作,您需要:
广告
类别将stringDate
、productName
、vendorId
、价格
和数量
存储为属性
getAdvertisementObservableList()
从AdvertisementDAO
获取ObservableList
,而是将ObservableList
移出,作为AdvertisementListController
的一个字段。您应该在数据发生变化时更改ObservableList
FXCollections.observableAryList(回调)
重载创建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);
}
}
公共类广告{
私有最终StringProperty stringDate=新SimpleStringProperty();
公共最终StringProperty stringDateProperty(){return stringDate;}
公共最终字符串getStringDate(){返回stringDate.get();}
公共最终void setStringDate(字符串s){stringDate.set(s);}
//其他属性
}
公共类AdvertisementListController{
@FXML公共表查看广告表;
@FXML公共表列dateColumn;
@FXML公共表列productColumn;
@FXML公共表列供应商列;
@FXML公共表列priceColumn;
@FXML公共表列quantityColumn;
private final ObservableList Advertisions=FXCollections.observableArrayList(Advertision->new Observable[]{Advertision.stringDateProperty()});
公共无效初始化(){
dateColumn.setCellValueFactory(新属性ValueFactory(“stringDate”);
productColumn.setCellValueFactory(新的PropertyValueFactory(“productName”);
vendorColumn.setCellValueFactory(新属性ValueFactory(“vendorId”);
priceColumn.setCellValueFactory(新属性ValueFactory(“价格”));
quantityColumn.setCellValueFactory(新属性ValueFactory(“数量”);
// ...
AdvertisementDAO AdvertisementDAO=新的AdvertisementDAO();
adverties.setAll(advertisementDAO.getAdvertisementList());
可发布广告。设置项目(广告);
}
}
JavaFX是一个使用模型-视图-控制器(MVC)设计模式的框架。如果您进行一些研究,您会发现MVC也使用了Observer
设计模式
JavaFX进一步支持了观察者
设计模式。JavaFX有属性
的概念,基本上是观察者
设计模式。一个属性
对象持有值,可以用来观察值的变化。属性
的基本接口(和可观察列表
等)是可观察的
因此,通过使用属性
(在您的例子中是可观察列表
),您已经在使用观察者
设计模式
因此,为了正确地完成这项工作,您需要:
广告
类别将stringDate
、productName
、vendorId
、价格
和数量
存储为属性
getAdvertisementObservableList()
从AdvertisementDAO
获取ObservableList
,而是将ObservableList
移出,作为AdvertisementListController
的一个字段。您应该在数据发生变化时更改ObservableList
FXColl创建observebleList