如何在Vaadin中为ListSelect添加Keylistener?

3

我有一个 vaadin 的 ListSelect 组件,我想在按下键盘上的 DEL 键时删除其中的项目。

我找到了 ShortcutListener,但如果我添加以下监听器,则 DEL 键在我的应用程序的其他地方(例如删除 TextField 中的文本)无法正常工作:

listSelect.addShortcutListener(new ShortcutListener("", KeyCode.DELETE, null) {
        private static final long serialVersionUID = 4703134138899283799L;

        @Override
        public void handleAction(Object sender, Object target) {
            // handle delete
        }
    });

我应该如何为DEL键实现一个监听器?

编辑:尝试使用评论中建议的包装器Panel,但仍然无法工作。这是我的当前代码:

listSelect = new ListSelect(null);
listSelect.setWidth(100, Unit.PERCENTAGE);
listSelect.setHeight(82, Unit.PIXELS);
listSelect.setMultiSelect(true);
listSelect.setNullSelectionAllowed(false);

listSelect.setDescription("Löschen mit der DEL Taste");
listSelect.addShortcutListener(new ShortcutListener("", KeyCode.DELETE, null) {
    private static final long serialVersionUID = 4703134138899283799L;

    @Override
    public void handleAction(Object sender, Object target) {
        // handle delete
    }
});
Panel wrapperPanel = new Panel(listSelect);
form.addComponent(wrapperPanel);

formGridLayoutform 的父组件是 Panel。该面板是 TabSheet 的一部分。我正在使用 Vaadin 版本 7.7.1。


所以这个代码可以工作(除了它会破坏应用程序的其他部分)吗?如果是这样,那么您可以尝试在该输入框周围添加一个(无边框的)面板作为屏障。 - cfrick
@cfrick 这是一个非常好的想法,但是乍一看,使用面板的解决方法似乎需要在面板上设置快捷键监听器,而不是在列表选择器上设置,否则它仍然会像 OP 描述的那样行为异常。请参见下面的我的答案。 - Morfic
1个回答

2

源代码(目前为第110行)来看,似乎将操作委托给包含的窗口...

/**
 * Keeps track of the Actions added to this component; the actual
 * handling/notifying is delegated, usually to the containing window.
 */
private ConnectorActionManager actionManager;

根据这个问题(在Vaadin表格中使用全选快捷键Ctrl-A),建议您将快捷键监听器添加到面板上,或者至少添加到父容器上,这样可以解决该问题。如果您将列表选择框包含在面板中,并向面板添加快捷键监听器,则可以按预期工作:

public class MyListSelectComponent extends VerticalLayout {

    public MyListSelectComponent() {
        ListSelect list = new ListSelect("Press DEL to remove items");
        TextField input = new TextField("Focus this input and press DEL to delete some text");
        input.setValue("This is some very long text, or not...");

        for (int i = 0; i < 10; i++) {
            list.addItem(i);
        }

        Panel panel = new Panel(list);
        panel.addShortcutListener(new ShortcutListener("", ShortcutAction.KeyCode.DELETE, null) {
            @Override
            public void handleAction(Object sender, Object target) {
                if (list.getValue() != null) {
                    list.removeItem(list.getValue());
                }
            }
        });

        addComponent(panel);
        addComponent(input);
    }
}

Actual output:

vaadin delete key shortcut listener


哦,我创建了一个wrapperPanel(请参见问题编辑),但它仍然无法工作。您使用的Vaadin版本是什么? - flavio.donze
@flavio.donze,版本号是7.6.8,但正如我在答案中所说的那样,监听器必须添加到面板而不是列表选择器上。 - Morfic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接