2016-09-22 53 views
2

我有,我想,如果使用的关键DEL删除项vaadin ListSelect组件。如何添加Keylistener到Vaadin的ListSelect?

所有我发现是在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。

+0

所以做这项工作(除了这个事实,它毁了其他的应用程序)?如果是这样的话,那么你可以尝试在该输入周围添加一个(无边框)面板作为屏障。 – cfrick

+0

@cfrick这是一个非常好的主意,但起初看来,面板的解决方法似乎需要在面板上设置快捷方式的侦听器而不是列表选择,否则它仍然像OP描述的那样工作。看到我的回答在 – Morfic

回答

2

望着sources (currently line 110),似乎动作委托给包含窗口...

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

...或父容器至少,因为基于这个问题Select-all shortcut (Ctrl-A) in Vaadin Table?你可以解决这个问题。如果您缠绕列表中选择一个面板和短切监听器添加到面板相反,它按预期工作:

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

实际输出:

vaadin delete key shortcut listener

+0

以下嗯,我创建了一个'wrapperPanel'(参见问题编辑),但它仍然不起作用。你使用什么vaadin版本? –

+0

@ flavio.donze它是7.6.8,但正如我在回答中所说的,必须在面板上添加监听器而不是列表选择。 – Morfic

+0

我的不好,你绝对是对的这个作品! –

相关问题