簡體   English   中英

JavaFX方法參考事件處理

[英]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任何超類(例如EventObject替換方法的參數類型,並且仍然可以通過簡單的向上轉換規則來工作。但是,您必須在該參數中指定一個可以引用的參數到ActionEvent 。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM