2017-07-17 135 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