编写自定义事件处理程序,如何从其他类访问?

时间:2017-03-05 19:05:40

标签: java javafx event-handling mvp tetris

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

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();
            }
        }
    });

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

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

1 个答案:

答案 0 :(得分:0)

EventHandler成为顶级课程。它似乎唯一需要访问的是视图。 (您可以通过为窗口提供引用来逃脱,但是在将视图添加到窗口之前,您可能希望注册事件处理程序。)

假设view来自名为View的类(只需根据需要进行更改):

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));