gpt4 book ai didi

JavaFX 方法引用事件处理

转载 作者:行者123 更新时间:2023-11-30 08:01:24 27 4
gpt4 key购买 nike

理论上,此方法引用应该有效,但实际上无效。我究竟做错了什么?

但是,如果我用 lambda 表达式替换方法引用,它确实有效:

btn.setOnAction(e-> btnPush());

import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;


public class NewFXMain extends Application {

@Override
public void start(Stage primaryStage) {

Button btn = new Button("Test Button");
btn.setOnAction(this::btnPush());

Pane root = new Pane();
root.getChildren().add(btn);

Scene scn = new Scene(root,300,300);

primaryStage.setTitle("Method Reference Test");
primaryStage.setScene(scn);
primaryStage.show();

}

private void btnPush(){
System.out.println("button pressed");

}

public static void main(String[] args) {
launch(args);
}

}

最佳答案

首先,你的语法是错误的。不要在方法引用上使用括号:

btn.setOnAction(this::btnPush);

其次,方法的签名与接口(interface)中定义的方法的签名不匹配。 setOnAction期待一个 EventHandler<ActionEvent> . EventHandler<T> 中定义的抽象方法是

public void handle(T event);

因此作为 lambda 表达式或方法引用传递的方法应该采用类型为 ActionEvent 的单个参数并且有 void返回类型。

btnPush方法不接受任何参数,因此不匹配。

(也许,另一种看待这个问题的方式是 this::btnPush 等同于 lambda 表达式 () -> this.btnPush(),并且该 lambda 表达式也不是 setOnAction 的有效参数。)

因此您可以使用您展示的 lambda 表达式,也可以修改方法定义:

private void btnPush(ActionEvent event) {
System.out.println("Button pressed");
}

现在您的 lambda 表达式版本将是

btn.setOnAction( e -> btnPush(e) );

这正是设计方法引用的场景:

btn.setOnAction(this::btnPush);

(当然,您可以将方法的参数类型替换为 ActionEvent 的任何父类(super class),例如 EventObject,它仍然可以通过简单的向上转换规则工作。但您必须那里的一个参数可以分配对 ActionEvent 的引用。)

关于JavaFX 方法引用事件处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37707918/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com