在Timeline对象的构造函数中使用lambda表达式会导致错误

时间:2017-01-31 13:38:27

标签: java netbeans javafx lambda

以下语句建议在NetBeans中更改为lambda表达式。

Timeline timeline = new Timeline(new KeyFrame(Duration.millis(5000), new EventHandler() {
            @Override
            public void handle(Event event) {
                //do something
            }
}));

但是,当我应用所谓的更改(Alt + Enter)时,我得到了:

Timeline timeline = new Timeline(new KeyFrame(Duration.millis(5000), (Event event) -> {
 //do something
}));

当这不能用消息编译时:

  

没有为KeyFrame找到合适的构造函数(持续时间,(事件   前夕[...]}}}) - 参数不匹配

问题是为什么NetBeans会提出它无法实现的内容?以及如何在Timeline构造函数中实际使用lambda函数? 感谢。

1 个答案:

答案 0 :(得分:1)

您呼叫的KeyFrame constructor需要EventHandler<ActionEvent>,而不是EventHandler<Event>

所以你需要

Timeline timeline = new Timeline(new KeyFrame(Duration.millis(5000), (ActionEvent event) -> {
 //do something
}));

NetBeans混淆并插入错误代码的原因是因为您以事件处理程序匿名内部类的原始类型开头:

Timeline timeline = new Timeline(new KeyFrame(Duration.millis(5000), new EventHandler() {
            @Override
            public void handle(Event event) {
                //do something
            }
}));

(我希望NetBeans在这里发出警告,以及使用lambda表达式的建议。)

正常良好的编码实践将使用正确类型的事件处理程序:

Timeline timeline = new Timeline(new KeyFrame(Duration.millis(5000), new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                //do something
            }
}));

在这种情况下,NetBeans可以用正确的lambda表达式替换它。