2014-10-28 32 views
1

我在JavaFx中創建應用程序。現在我有兩個tableviews彼此相鄰:JavaFX:基於其他TableView禁用TableView中的多行

------------------------------------------------------------------------------ 
| TableView 1      | TableView 2       | 
|         |          | 
|         | Entry 1        | 
|         | Entry 2        | 
|         | Entry 3        | 
|         | Entry ...       | 
|         | Entry N        | 
------------------------------------------------------------------------------ 

我想從TableView中2項複製到的TableView 1,但在同一時間,被禁止已經從TableView中2需要複製的條目(禁用setDisable或類似的行)。我知道如何將項目從一個tableview複製到另一個。問題是,我不知道如何禁用多行,當一個或多個條目已被複制到的TableView 1 我試圖與一個RowFactory,像這樣:

productsInTransaction.setRowFactory(tv -> { 
     TableRow<Product> row = new TableRow<>(); 
     row.disableProperty().bind(???); 
     return row; 
}); 

任何幫助,非常感謝!

回答

1

我不太清楚你想要的邏輯,但如果你行的工廠連接到表1,要禁用行,當產品出現在表2中,這樣做:

row.disableProperty().bind(Bindings.createBooleanBinding(() -> 
    table2.getItems().contains(row.getItem()), table2.getItems(), row.itemProperty())); 
+0

謝謝!這似乎是正確的解決方案,但是,我想比較條目(在我的情況下是對象)的一個屬性。因此,例如,如果我的TableView包含Person對象,其中Name和Age作爲屬性,我想禁用基於Name(unique)的行。我怎樣才能做到這一點? – 2014-10-28 16:51:25

+1

我現在的答案是「使用[EasyBind框架](https://github.com/TomasMikula/EasyBind)」。你可以做'ObservableList names = EasyBind.map(table2.getItems(),Person :: getName);',然後綁定是'createBooleanBinding(() - > names.contains(row.getItem()。getName )),names,row.itemProperty())' – 2014-10-28 16:57:08

+0

當然,快速和骯髒的方法是重寫'Person'類中的'equals(...)'來比較名稱。當然,對於其他應用程序,您可能需要「equals(...)」的不同語義。 – 2014-10-28 16:58:46