2017-12-19 16 views
0

私はJavaFXアプリケーションを書いています。私はデータベースのテーブルに新しいエントリを挿入することができます私のアプリケーションの別のウィンドウからObserverパターンで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()); 
    } 

:私は次のように人口データベースからすべてのエントリを持つTableViewを持っています。私はGoFパターンが新しく、テーブルを更新したままにするために、オブザーバーパターンをここに実装しようとしていますが、どこから始めるべきかわかりません。 ここには何がありますか? Observerクラスとは何ですか?

+0

は、私はここにも 'Advertisement'クラスにコードの相対を追加する必要がありますか? – Robb1

答えて

2

JavaFXは、MVC(Model-View-Controller)デザインパターンを使用するフレームワークです。いくつかのリサーチを行うと、MVCもObserverデザインパターンを使用していることに気付くでしょう。

JavaFXは、Observerデザインパターンのサポートをさらに進めました。 JavaFXは、基本的にObserverデザインパターンであるPropertyという概念を持っています。 Propertyオブジェクトは値を保持し、値の変化を監視するために使用できます。 Property(およびObservableListなど)の基本インターフェイスはObservableです。

したがって、Property(ご使用の場合はObservableList)を使用すると、既にObserverデザインパターンが使用されています。

だからそれを正しく行うためには、これらは何が必要です:

  1. は、あなたのAdvertisementクラス店stringDateproductNamevendorIdpricePropertyなどquantityていることを確認します。
  2. ObservableListAdvertisementDAOからgetAdvertisementObservableList()に変更する代わりに、AdvertisementListControllerのフィールドとしてObservableListをシフトアウトします。データが変更されるたびにObservableListを変更する必要があります。
  3. 他のウィンドウがデータをどのように変更するかによって、ObservableListFXCollections.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); 
    } 
} 
+0

あなたの答えをありがとう、非常に明確です。私はまだ 'advertisements'変数の宣言の中で' stringDateProperty() 'コールを取得しません。それを説明できますか? – Robb1

+0

また、 'String'の代わりに' StringProperty'を使うと、私のプロジェクトで 'Advertisement'属性のすべての使い方を変更する必要があります...しかし、' String'を 'StringProperty '(' StringProperty'と '抽象クラス'もあります)。助けて! – Robb1

+2

@ Robb1 "StringをStringPropertyに解析する簡単な方法が見つかりません"。答えのコードに何が間違っていますか? 'private final StringProperty stringDate = new SimpleStringProperty();'および 'stringDate.set(s)'? –

関連する問題