java - 在主 Controller 之外创建 EventHanler

标签 java javafx-2

基于JavaFX EventHandler<T>为特定操作创建监听器非常简单。为了便于论证,代码如下所示:

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

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

如果我想让这个看起来稍微干净一点,我可以实现 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 访问 Controller ?或者将所有内容留在 Controller 中是最佳实践吗?

最佳答案

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

关于java - 在主 Controller 之外创建 EventHanler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14218804/

相关文章:

java - 带有占用指示器的命令行进度条

java - 在JavaFX按钮中显示dicom

image - 减少颜色数量并获得单个像素的颜色

java - setOnKeyPressed 事件无法正常工作

java - 定期 JavaFX 服务

javafx - javaFx 应用程序中的 Bootstrap 样式?

java - 当 Eclipse 没有自动创建 getter 和 setter 时,如何强制它提示您创建它?

java - Python 与 Java

java - 在 eclipse 项目中链接名称为 "src"的外部源文件夹

java - 在 Java 中测试 try-catch block