编写自定义事件处理程序,如何从不同的 class 访问?

Writing a custom eventhandler, how to access from a different class?

我正在尝试根据您按下按钮时我的应用程序创建的警报编写自定义事件处理程序。这就是我要提取的内容(见下文)。

view.getStart().setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
            alert.setHeaderText("This will reset the game.");
            alert.setContentText("Are you sure?");
            alert.setTitle("Warning");
            alert.getButtonTypes().clear();
            ButtonType no = new ButtonType("No");
            ButtonType yes = new ButtonType("Yes");
            alert.getButtonTypes().addAll(no, yes);
            alert.showAndWait();
            if (alert.getResult() == null || alert.getResult().equals(no)) {
                event.consume();
            }
            if (alert.getResult().equals(yes)) {
                view.getTextField();
                view.getScene().getWindow().hide();
            }
        }
    });

我知道如何使处理程序成为独立的 class 然后使用它而不是新的 EventHandler,但我不知道如何获取变量:alert.getResult(), alert.getButtonType() & alert.getEvent.consume();

注意:我正在使用模型视图演示器,这目前在我的视图中 class。

只需将 EventHandler 设置为顶级 class。它似乎唯一需要访问的是视图。 (您可以通过给它一个 window 的引用来逃避,但是您可能希望在将视图添加到 window 之前注册事件处理程序。)

假设 view 来自一个名为 View 的 class(只需根据需要更改):

public class CloseRequestHandler implements EventHandler<ActionEvent> {

    private final View view ;

    public CloseRequestHandler(View view) {
        this.view = view ;
    }

    @Override
    public void handle(ActionEvent event) {
        Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
        alert.setHeaderText("This will reset the game.");
        alert.setContentText("Are you sure?");
        alert.setTitle("Warning");
        alert.getButtonTypes().clear();
        ButtonType no = new ButtonType("No");
        ButtonType yes = new ButtonType("Yes");
        alert.getButtonTypes().addAll(no, yes);
        alert.showAndWait();
        if (alert.getResult() == null || alert.getResult().equals(no)) {
            event.consume();
        }
        if (alert.getResult().equals(yes)) {

            // this line of code doesn't do anything, btw:
            view.getTextField() ;

            view.getScene().getWindow().hide();
        }
    }
}

然后你只需要

view.getStart().setOnAction(new CloseRequestHandler(view));