Проблемы с использованием ярлыков в Vaadin - PullRequest
2 голосов
/ 26 января 2012

У меня есть некоторые проблемы с ярлыками в таблице.Мне нужно настроить некоторые клавиши: delete - для удаления строк и ввода, чтобы сделать таблицу редактируемой / недоступной для редактирования, стрелки вверх / вниз для переключения режима таблицы с редактируемого на нередактируемый.Я помещаю свою таблицу в прозрачную панель и использую Action.Handler для перехвата событий клавиатуры.Но когда я пишу внутри TextField, TextArea, Combobox, я хотел распространить события на этот компонент (обработка ключа удаления отключить, используя его для удаления текста в TextField, а клавиши вверх / вниз не позволяют открывать Combobox с клавиатуры).Я видел целевой параметр в методе handleAction (), но пока не знаю, как его использовать.Также интересно узнать, как добавлять ярлыки вместо замены.

    // adding table inside Panel
    tablePanel = new Panel();
    tablePanel.setStyleName(Panel.STYLE_LIGHT);

    VerticalLayout tableElementsLayout = new VerticalLayout();
    tablePanel.setContent(tableElementsLayout);

    tablePanel.setSizeFull();
    tableElementsLayout.setSizeFull();
    vl.addComponent(tablePanel);
    vl.setExpandRatio(tablePanel, 1.0f);

    tableElementsLayout.add(table);

    // --- adding keyboard handler
    final Action actionDel = new ShortcutAction("Delete",
            ShortcutAction.KeyCode.DELETE, null);

    deleteHandler = new Action.Handler() {

        @Override
        public void handleAction(Action action, Object sender, Object target) {
            // I want handle events here when I'm not inside TextField
        }

        @Override
        public Action[] getActions(Object target, Object sender) {
            return new Action[] { actionDel };
        }
    };

    tablePanel.addActionHandler(deleteHandler);        

Есть идеи, как это сделать?

1 Ответ

3 голосов
/ 26 января 2012

Я не уверен, что это лучший или самый красивый способ добиться этого, но, по крайней мере, он работает:

textField.addListener(new BlurListener() {
    @Override
    public void blur(BlurEvent event) {
        tablePanel.addActionHandler(deleteHandler);
    }
});

textField.addListener(new FocusListener() {
    @Override
    public void focus(FocusEvent event) {
        tablePanel.removeActionHandler(deleteHandler);
    }
});

Эти слушатели позаботятся о deleteHandler, отключая его каждый раз, когда пользователь входит в поле, и включая его всякий раз, когда пользователь покидает поле.

...