1

基于 JavaFX EventHandler<T>,为特定操作创建侦听器非常简单。为了争论,代码看起来像这样:

btn.setOnAction(new EventHandler<ActionEvent>() {
    public void handle(ActionEvent event) {
        System.out.println("Hello World");
    }
});

现在假设我想在这个事件上处理更复杂的事情(假设我需要 50-100 行代码)。我可以使用相同的方法并在我的处理程序中包含所有这些代码,从而在我的控制器中。

如果我想让这个看起来稍微干净一点,我可以实现这个EventHandler<T>接口。这看起来像这样:

public class LoginHandler implements EventHandler<ActionEvent> {

    // list of parameters passed

    public LoginHandler(ResourceBundle resources) {
        //Resources along with other paramters I need to access
        this.resources = resources;
    }

    @Override
    public void handle(ActionEvent event) {
        //...Logic goes here
        System.out.println("doing my logic here - 50 to 100 lines");
        ((Node)(event.getSource())).getScene().getWindow().hide();
    }
}

这种方法有效,但我必须将所有对象(无论是按钮、标签、文本框等)和 ResourceBundle(如果试图国际化我的应用程序)作为参数传递。

有没有办法访问所有这些信息?基本上从EventHandler?还是将所有内容都留在控制器中的最佳做法?

4

2 回答 2

1

在我看来,如果handle 方法中要完成的逻辑与视图(即FXML 中的控件)相关,则应该将其保留在控制器中。除了控制器之外,没有人必须知道 FXML 结构。如果要在扩展的 eventHandler 中做一个通用的通用逻辑,除了其他参数之外,还要将控制器实例传递给这个 eventHandler。然后将与视图相关的作业委托给控制器,例如 controller.updateView(params)。这些控制器还可以实现具有 updateView(params) 方法签名的通用接口。

于 2013-01-08T16:20:08.343 回答
1

For use cases where you need access to UI controls I recommend to use an anonymous class as in your first example, but you can extract some methods if it gets too long/ for readability.

于 2013-01-09T11:37:57.627 回答