2017-04-04 14 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()' –