在主控制器之外创建EventHanlers

时间:2013-01-08 15:48:58

标签: java javafx-2

基于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访问控制器?或者是将所有内容都留在控制器中的最佳做法?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

对于需要访问UI控件的用例,我建议您使用第一个示例中的匿名类,但如果它太长/可读性,您可以提取一些方法。