2016-11-16 14 views
0

Речь идет о внедрении функции Listener в ListView.ListView selection listener: ошибка не найдено подходящего метода для addListener (<anonymous ChangeListener <String>>)

listView.setItems(FXCollections.observableList(content.getListContent())); 
listView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<String>() { 
     @Override 
     public void changed(ObservableValue<? extends String> observableValue, String s, String s2) { 
        System.out.println("Selected item: " + s2); 
     } 
    }); 

Я получаю сообщение об ошибке:

error: no suitable method found for addListener(<anonymous ChangeListener<String>>) 
    listView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<String>() { 
method Observable.addListener(InvalidationListener) is not applicable 
    (argument mismatch; <anonymous ChangeListener<String>> cannot be converted to InvalidationListener) 
method ObservableValue.addListener(ChangeListener<? super Warning>) is not applicable 
    (argument mismatch; <anonymous ChangeListener<String>> cannot be converted to ChangeListener<? super Warning>) 

Я не знаю, как это исправить. Кто-нибудь может помочь? Заранее спасибо.

+0

Просьба показать объявление 'listView'. Каков тип возврата 'content.getListContent()'? –

+0

Возвращаемый тип 'content, getListContent()' is 'List ', а 'ListView' также является типом' ListView '. – GrosseGrille

+0

Это не соответствует сообщению об ошибке. –

ответ

0

Я предполагаю, что из сообщения об ошибке объявившего представления списка, как

private ListView<Warning> listView ; 

и типа возвращаемого content.getContentList() является List<Warning> (или что-то, что является Субинтерфейсом или осуществление этого).

ListView<T>.getSelectionModel() возвращает MultipleSelectionModel<T> (см docs), так listView.getSelectionModel() дает вам MultipleSelectionModel<Warning>.

MultipleSelectionModel<T>.selectedItemProperty() возвращает ReadOnlyObjectProperty<T> (см docs), поэтому listView.getSelectionModel().selectedItemProperty() вычисляется в ReadOnlyObjectProperty<Warning>.

Наконец, ReadOnlyObjectProperty<T> наследует addListener(ChangeListener<? super T>) метод от ObservableValue<T> (docs), поэтому вам нужно пройти в ChangeListener<T> где T является Warning или некоторый суперкласс него.

Так что вам нужно

listView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Warning>() { 
    @Override 
    public void changed(ObservableValue<? extends Warning> observableValue, Warning s, Warning s2) { 
     System.out.println("Selected item: " + s2); 
    } 
}); 

Обратите внимание, что с помощью Java8 лямбды и определения типа позволит обойти весь вопрос:

listView.getSelectionModel().addListener((obs, oldValue, newValue) -> { 
    System.out.println("Selected item: "+newValue); 
}); 

Если вы используете это, приличный IDE будет также быть в состоянии что newValue является Warning здесь и предоставляет вам доступ к его методам и т. д.

+0

Большое вам спасибо. Иногда вы не распознаете простейшие ошибки. – GrosseGrille

+0

@GrosseGrille Сообщение об ошибке здесь очень полезно. Также обратите внимание, что использование современных языковых функций позволяет полностью избежать подобных ошибок. См. Обновление для ответа. –

 Смежные вопросы

  • Нет связанных вопросов^_^