2016-09-22 47 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

我的不好,你絕對是對的這個作品! –