2014-07-08 44 views
0

我正在使用一個單例作爲Employee對象的假數據庫。使用ObservableMap填充和同步組合框?

在這個僞數據庫中,有一個ObservableMap,它使用Employees的社會安全號碼作爲唯一鍵。

我有組合框,TableViews和列表視圖我想這個數據庫來填充,以及確保數據庫中的任何更改將在這些TableViews,列表視圖反映等

組合框,電視,而LV需要一個ObservableArraylist,但是,我怎麼才能從HashMap中獲取呢?我可以通過迭代器手動提取值並將它們添加到新的ObservableArraylist中,但是如果在數據庫中進行了任何更改,我將不得不手動調整ObservableArraylist。我寧願讓手動同步。

任何想法,我應該做什麼?

編輯:

顯然,這個工作(我必須非常具體也不清楚,爲什麼我必須使用通配符,而不是僅僅作爲一個泛型參數

employeeMap 
      .addListener((
        MapChangeListener.Change<? extends Integer, ? extends Employee> listener) -> { 
       System.out.println("CHANGED"); 
      }); 
+0

首先ComboBoxes,TableViews和ListViews需要ObservableLists,而不是ObservableArrayLists。而對於你的問題:如果你看看ObservableMapWrapper#keySet的來源,你可以看到它返回一個ObservableKeySet。不幸的是ObservableKeySet是一個私有類,它不實現ObservableSet。 – Vertex

回答

1

此。未測試,但你可以試試:

ObservableMap<String, Employee> employeeMap = DataBase.getInstance().getEmployeeMap(); 
ListView<Employee> listView = new ListView<>(); 
listView.getItems().addAll(employeeMap.values()); 

employeeMap.addListener((Change change) -> { 
    if (change.wasAdded()) { 
     listView.getItems().add(change.getValueAdded()); 
    } else if (change.wasRemoved()) { 
     listView.getItems().remove(change.getValueRemoved()); 
    } 
}); 

注意,現在你必須修改僅在ObservableMap FX應用程序線程。如果您需要在不同的線程上修改它,您需要將呼叫打包爲listView.getItems().add(...)listView.getItems().remove(...)Platform.runLater(...)

+0

單例存在於一個包中,而具有ListView的FXML的控制器存在於另一個包中。我無法從數據庫類訪問列表視圖。 –

+0

你應該沒有必要從數據庫類訪問列表視圖;只需訪問您的控制器。它們是否在不同的包裝中並不重要。 –

+0

好吧,我明白你要做什麼!你能解釋一下如何正確使用這些聽衆嗎? java文檔並沒有太多幫助,也沒有提供如何添加偵聽器的示例。 .addListener方法可以使用InvalidationListener或MapChangeListener(兩者都具有令人驚奇的語法)。我使用哪些,爲什麼/如何?我正在嘗試你放的東西,但是我得到一個編譯器錯誤。 (「The method is ambiguous ...」) –