[英]JavaFX method reference event handling
從理論上講,該方法參考應該可以,但是不能。 我究竟做錯了什么?
但是,如果我用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);
其次,方法的簽名與接口中定義的方法的簽名不匹配。 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
任何超類(例如Event
或Object
替換方法的參數類型,並且仍然可以通過簡單的向上轉換規則來工作。但是,您必須在該參數中指定一個可以引用的參數到ActionEvent
。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.