使用Observer模式更新TableView

时间:2017-12-19 07:07:26

标签: java javafx observer-pattern

我正在编写 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课程是什么?

1 个答案:

答案 0 :(得分:2)

JavaFX是一个使用模型 - 视图 - 控制器(MVC)设计模式的框架。如果你做一些研究,你会发现MVC也使用Observer设计模式。

JavaFX更进一步支持Observer设计模式。 JavaFX具有Property的概念,它基本上是Observer设计模式。 Property对象保存该值,它可用于观察值的变化。 Property(和ObservableList等)的基础界面为Observable

因此,使用Property(在您的情况下为ObservableList),您已经在使用Observer设计模式。

所以为了正确地做到这些,你需要的是:

  1. 确保您的Advertisement班级商店stringDateproductNamevendorIdpricequantityProperty。< / LI>
  2. 不是从ObservableList通过AdvertisementDAO获取getAdvertisementObservableList(),而是将ObservableList移出AdvertisementListController作为字段。每当数据发生变化时,您应该改为ObservableList
  3. 根据其他窗口更改数据的方式,您可能还需要创建ObservableList FXCollections.observableArrayList(Callback)超载。
  4. 示例:

    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);
        }
    }