Как подписаться на KeyEvent в ZK 7.X - PullRequest
0 голосов
/ 23 апреля 2020

Мы создаем окно для добавления вложений. Вложения могут быть добавлены либо с помощью Drag N Drop, либо с помощью Ctrl + V для копирования из буфера обмена. Может реализовывать перетаскивание, но не может подписать 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 внутри пользовательского класса Window, который реализует EventListener.

    this.addEventListener (Events.ON_CTRL_KEY, this);

Весь пример кода, который я мог видеть в Интернете, с файлом ZUL. Но мне нужно добиться этого, используя код java динамически.

Я могу подписаться на другие события, такие как событие щелчка, при закрытии и т. Д. c.

1 Ответ

3 голосов
/ 24 апреля 2020

У вас есть несколько вещей, которые нужно настроить для прослушивания ключей:

1: цель Если вы хотите прослушивать ключи на всей странице, первое, что вам нужно, это объявить это свойство библиотеки в вашем zk. xml: https://www.zkoss.org/wiki/ZK_Configuration_Reference/zk.xml/The_Library_Properties/org.zkoss.zk.ui.invokeFirstRootForAfterKeyDown.enabled со значением "true"

Это свойство библиотеки перенаправляет каждое событие ключевого слушателя на компонент root вашей страницы. Если вы не установите его, вы сможете прослушивать ключи компонента, только когда он находится в фокусе.

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

См. эту скрипку !!!! ЭТА НЕПРАВИЛЬНАЯ РАБОТА НА УРОВНЕ СТРАНИЦЫ !!!! из-за того, что свойство библиотеки не устанавливается в zkfiddle. Просто запустите его локально со своим zk. xml, включая указанное выше свойство, чтобы иметь прослушивателей на уровне страницы.

...