Java 使用观察者模式保持表视图的更新

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

我正在编写一个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());
    }
公共类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