在Vaadin中使用快捷方式的问题

时间:2012-01-25 21:58:37

标签: keyboard-shortcuts vaadin event-propagation

我在表格中遇到一些快捷方式问题。我必须自定义一些键:删除 - 用于删除行并输入以使表格可编辑/不可编辑,向上/向下箭头将表格的模式从可编辑切换为不可编辑。我将我的表放在透明面板中,并使用Action.Handler来捕获键盘事件。但是当我在TextField,TextArea,Combobox中编写时,我想将事件传播到此组件(处理删除键禁用使用它来删除TextField中的文本,上/下键不允许使用键盘打开Combobox)。我在handleAction()方法中看到了target参数,但我现在不知道如何使用它。同样有趣的是知道如何添加快捷方式而不是替换。

    // 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 个答案:

答案 0 :(得分:3)

我不确定这是实现这一目标的最佳方式还是最美妙方式,但至少它有效:

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