2017-07-17 52 views
0

调用方法,我发现非常好的一段代码在这里:blogJavaFX的回调实现与拉姆达

我要实现它在我的应用程序。这篇博文是从2014年开始的,作者没有使用lambda。我试图自己做,以避免真正丑陋的匿名电话,但我无法弄清楚,如何做到这一点。有原代码:

tableColumn.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ObservableList, String>, ObservableValue<String>>() { 
        @Override 
        public ObservableValue<String> call(TableColumn.CellDataFeatures<ObservableList, String> param) { 
         return new SimpleStringProperty((param.getValue().get(j).toString())); 
        } 
       }); 

和IntelliJ会自动将其转换为:

tableColumn.setCellValueFactory(param -> 
new SimpleStringProperty((param.getValue().get(j).toString()))); 

但有一个错误:在 “参数”

Cannot resolve method getValue() 

。我已经改变了这一点:

tableColumn.setCellValueFactory((TableColumn.CellDataFeatures<ObservableList, String> param) -> 
new SimpleStringProperty((param.getValue().get(j).toString()))); 

而且这不是因为那个工作:

Incompatible parameter types in lambda expression: 
expected object but found CellDataFeatures<ObservableList, String> 

我一直在四处寻找如何解决它,但unfortunelly我找不到简单回答。

+0

你的'TableColumn'是如何声明的? –

回答

1

您很可能正在使用原始TableColumn实例。
虽然TableColumn是一个泛型类声明为TableColumn<S,T>其中

S - Th type of the TableView generic type (i.e. S == TableView)

T - The type of the content in all cells in this TableColumn.

所以,当你写:

col.setCellValueFactory(
     (param->new SimpleStringProperty(param.getValue().get(j).toString()))); 

param是由编译器作为与Object类声明的变量考虑和Object不当然有一个getValue()方法。
尽管编译错误:

Cannot resolve method getValue()

声明一个参数/通用TableColumn情况下,它应该解决您的问题。

+0

谢谢!这是问题所在。改变这一点,以纠正泛型而不是原始类型给了我头痛,但最后它没有单一的警告,并与漂亮的lambda :) – PatrykMilewski

+0

不客气。原始类型对我们来说真的很糟糕;-) – davidxxx