ZK 如何订阅 KeyEvent 7.X

How to subscribe KeyEvent in ZK 7.X

我们正在创建一个 Window 来添加附件。可以通过拖放或使用 Ctrl+V 从剪贴板复制来添加附件。能够实现拖放但无法在 Window 或页面上订阅 KeyEvent。

尝试了以下代码但失败了:

  1. onPageAttached & onPageDetached

    @Override
    public void onPageDetached(Page page) {
        super.onPageDetached(page);
        try {
            SessionManager.getSessionApplication().getKeylistener().removeEventListener(Events.ON_CTRL_KEY, this);
        } catch (Exception e) {}
    }
    
    @Override
    public void onPageAttached(Page newpage, Page oldpage) {
        super.onPageAttached(newpage, oldpage);
        if (newpage != null) {
            SessionManager.getSessionApplication().getKeylistener().addEventListener(Events.ON_CTRL_KEY, this);
        }
    } 
    
  2. addEventListener 在实现 EventListener 的自定义 Window class 中。

    this.addEventListener(Events.ON_CTRL_KEY,这个);

我在网上看到的所有代码示例都是带有 ZUL 文件的。但是我需要动态地使用 java 代码来实现。

我可以订阅其他事件,例如点击事件、关闭事件等

您需要配置一些东西来监听按键:

1:目标 如果你想监听整个页面的按键,你需要做的第一件事就是在你的zk.xml中声明这个库属性: https://www.zkoss.org/wiki/ZK_Configuration_Reference/zk.xml/The_Library_Properties/org.zkoss.zk.ui.invokeFirstRootForAfterKeyDown.enabled 值为 "true"

此库 属性 将每个关键侦听器事件重定向到页面的根组件。 如果不设置,则只有在组件获得焦点时才能监听到按键。

2:密钥声明 您需要使用 comp.setCtrlKeys(ctrlKeys); 声明您收听的键 其中 ctrlKeys 是包含您要收听的键的字符串 例如,ctrl+v 将是 comp.setCtrlKeys("^v");

3:听者 您的示例代码已有此版本。您可以使用 add addEventLister(this) 语法,但这会使任务过于复杂。 如果您不重复使用它,最简单的选择是内联监听器:

//comp here is the root div of my page
comp.setCtrlKeys("^v");
comp.addEventListener(Events.ON_CTRL_KEY, new EventListener<Event>() {
    @Override
    public void onEvent(Event event) throws Exception {
        Clients.log("do something at page level");
    }
});

参见this fiddle !!!!此 FIDDLE 无法在页面级别运行!!!!由于库 属性 无法在 zkfiddle 上设置。只需 运行 在本地使用您的 zk.xml 包括上面的 属性 即可拥有页面级侦听器。