【问题标题】:ListView selection listener: error no suitable method found for addListener(<anonymous ChangeListener<String>>)ListView 选择侦听器:错误找不到适合 addListener(<anonymous ChangeListener<String>>) 的方法
【发布时间】:2016-11-16 13:15:29
【问题描述】:

这是关于实现一个 ListView 的选择监听器。

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>)

我不知道如何解决这个问题。有人可以帮忙吗?提前致谢。

【问题讨论】:

  • 请出示listView的声明。 content.getListContent()的返回类型是什么?
  • content,getListContent() 的返回类型为List&lt;Warning&gt;ListView 的返回类型也是ListView&lt;Warning&gt;
  • 那其实和报错信息不一致。
  • 对不起,类型是Warning,我编辑了我的评论。

标签: listview javafx selection changelistener


【解决方案1】:

我从错误消息中猜测您将列表视图声明为

private ListView<Warning> listView ;

并且content.getContentList() 的返回类型是List&lt;Warning&gt;(或者是它的子接口或实现)。

ListView&lt;T&gt;.getSelectionModel() 返回一个MultipleSelectionModel&lt;T&gt;(参见docs),所以listView.getSelectionModel() 给你一个MultipleSelectionModel&lt;Warning&gt;

MultipleSelectionModel&lt;T&gt;.selectedItemProperty() 返回一个ReadOnlyObjectProperty&lt;T&gt;(参见docs),因此listView.getSelectionModel().selectedItemProperty() 的计算结果为ReadOnlyObjectProperty&lt;Warning&gt;

最后,ReadOnlyObjectProperty&lt;T&gt;ObservableValue&lt;T&gt; (docs) 继承了一个addListener(ChangeListener&lt;? super T&gt;) 方法,因此您需要传入一个ChangeListener&lt;T&gt;,其中TWarning 或它的某个超类。

所以你需要

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 lambda 和类型推断可以让您回避整个问题:

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

如果你使用它,一个像样的 IDE 也将能够推断出newValue 在这里是一个Warning,并允许你访问它的方法等。

【讨论】:

  • 非常感谢。有时您无法识别最简单的错误。
  • @GrosseGrille 错误信息在这里非常有用。另外请注意,使用最新的语言功能可以完全避免此类错误。查看更新以回答。
猜你喜欢
  • 2017-07-09
  • 2019-06-24
  • 2019-04-30
  • 1970-01-01
  • 1970-01-01
  • 2015-02-02
  • 1970-01-01
  • 2015-06-17
  • 1970-01-01
相关资源
最近更新 更多