java - 使用观察者模式保持 TableView 更新

标签 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 类?

最佳答案

JavaFX 是一个使用模型- View - Controller (MVC) 设计模式的框架。如果您进行一些研究,您会发现 MVC 也使用 Observer 设计模式。

JavaFX 在支持Observer 设计模式方面又向前迈进了一步。 JavaFX有Property的概念,它基本上是Observer设计模式。 Property 对象保存值,它可用于观察值的变化。 Property(以及ObservableList等)的基本接口(interface)是Observable

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

因此,为了正确执行此操作,您需要以下内容:

  1. 确保您的 Advertisement 类存储 stringDateproductNamevendorIdprice数量 作为属性
  2. 不要通过 getAdvertisementObservableList()AdvertisementDAO 获取 ObservableList,而是将 ObservableList 移出,作为AdvertisementListController 的字段。当数据发生变化时,您应该更改 ObservableList
  3. 根据其他窗口更改数据的方式,您可能还需要使用 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/

相关文章:

java - 如果没有主体,Java 中的 while 循环是否不检查它们的条件?

java - 从 Eclipse 的 CMD 访问 sqlite 表

c++ - 模拟模板化数据成员是否合适?

java - 使我的处理器达到峰值的方法

java - map 的通用方法

java - 通过 Java 套接字发送带有 <APPLET> 标记的 html 文件

Java 8 使用 Streams 算法搜索 ArrayList 失败

colors - JavaFX-如何为形状填充颜色?

java - 用于获取 JavaFX WebView 控制台事件的公共(public) API 是什么?

android - 如何在订阅 liveData 后仅针对新更新观察 liveData