2017-04-04 18 views
0

我有一個TextFieldTableCell<Item,String>,我需要驗證,所以不能使用在通用回調沒有推理的JavaFX

column.setCellFactory(TextFieldTableCell.forTableColumn()); 

通常的方式,使我的意圖是要像做

column.setCellFactory(param -> { 
    TableCell<Item,String> cell = TextFieldTableCell.forTableColumn().call(params); 
    validate(validationRules, cell); 
}); 

但是它說,

CallbackTableColumn<Object,String>,TableCell<Object,String> cannot be 
applied to TableColumn<Item,String> 

我得到的,我不明白的是應該把它推斷出類型,而不是Object

我發現的唯一解決方法是定義一個新的StringConverter<String>,這似乎有點令人厭惡。

new StringConverter<String>() { 
      @Override 
      public String toString(String object) { 
       return object; 
      } 

      @Override 
      public String fromString(String string) { 
       return string; 
      } 
     } 
+1

我覺得你還是可以使用TextFieldTableCell.forTableColumn()。在你的setOnEditCommit中,你應該能夠驗證你的數據。 – Sedrick

+0

沒錯,但驗證應該在開始之前開始編輯 –

+0

爲什麼不使用TableCell cell = new TextFieldTableCell <>();'雖然? –

回答

1

通過鏈接兩個方法調用(TextFieldTableCell.forTableColumn()call()),您不會指定第一個方法的實際返回類型,因此編譯器沒有機會推斷應該返回的類型從該方法調用。

如果你希望編譯器推斷出這一點,你可以做

Callback<TableColumn<Item, String>, TableCell<Item, String>> callback = TextFieldTableCell.forTableColumn(); 
TableCell<Item, String> cell = callback.call(param); 

當然,這不僅僅是指定類型的泛型方法forTableColumn直接更爲詳細:

TableCell<Item, String> cell = TextFieldTableCell.<Item>forTableColumn().call(param); 

儘管如此,所有這些似乎都是人爲的。您正在執行回調,並且因爲TextFieldTableCell有適當的構造函數可用,所以不需要經過中間Callback。你可以這樣做:

column.setCellFactory(col -> { 
    TextFieldTableCell<Item, String> cell = new TextFieldTableCell<>(); 
    validate(validationRules, cell); 
    return cell ; 
}); 

,或者,如果你需要指定一個轉換器:

StringConverter<String> converter = ... ; 
column.setCellFactory(col -> { 
    TextFieldTableCell<Item, String> cell = new TextFieldTableCell<>(converter); 
    validate(validationRules, cell); 
    return cell ; 
}); 

對於默認的轉換器,你可以只使用

TextFieldTableCell<Item, String> cell = 
    new TextFieldTableCell<>(TextFormatter.IDENTITY_STRING_CONVERTER); 
+0

當使用空的構造函數實例化TableCell時,轉換器爲空,這就是爲什麼我開始尋找替代方法 –

+1

所以你不能用其他構造函數實例化嗎? –

+0

是的,但後來我不得不做一個轉換器從字符串到字符串,問題更新 –

1

你需要隱含指定調用中使用列類型forTableColumn()

TableCell<Item,String> cell = TextFieldTableCell.<Item>forTableColumn().call(param); 

如果你會看forTableColumn()JavaDoc,你會看到,它依賴於泛型類型S這是您的TableView中的元素類型。如果未指定,則使用Object類型,當您嘗試將其分配給TableCell<Item,String> cell時會導致問題。

+0

謝謝,你能解釋一下嗎?爲什麼? –

+0

我無法在ComboBoxTableCell上工作 –

+1

您需要在ComboBoxTableCell中指定兩種類型:ComboBoxTableCell。 forTableColumn()' –