2013-11-28 116 views
8

我正在使用vaadin TextArea作爲粗略的控制檯。用戶可以輸入當他按下回車鍵時應該執行的命令。有沒有辦法用TextArea上的偵聽器來指定它?如何檢測輸入密鑰按vaadin TextArea

我發現的最接近的就是用:

TextArea textArea = new TextArea(); 
textArea.addTextChangeListener(this); 
textArea.setTextChangeEventMode(TextChangeEventMode.EAGER); 

和處理文本更改事件:一旦

@Override 
public void textChange(TextChangeEvent event) { 
    System.out.println(event.getText()); 
} 

但是,這是觸發文本已在文本區域中輸入。我只希望在按下回車鍵時收到通知。

回答

13

你可以不聽快捷的文本區域本身鍵,但一個簡單的解決辦法是添加一個提交按鈕和使用輸入,因爲它的快捷方式:

Button b = new Button("submit", new Button.ClickListener() { 
    @Override 
    public void buttonClick(ClickEvent event) { 
     // handle your event 
    } 
}); 
layout.addComponent(b); 
b.setClickShortcut(KeyCode.ENTER); 

您可以自己隱藏的按鈕,如果你不」牛逼希望它:

b.setVisible(false); 

另一種解決方案是使用ShortcutActions和處理程序,如這裏所描述: https://vaadin.com/book/-/page/advanced.shortcuts.html

但無論哪種情況,您都必須考慮到使用TextArea組件時,聽輸入鍵會導致衝突,因爲您還需要使用相同的鍵才能到達TextArea中的下一行。

+0

不幸的是,此解決方案不再有效。請參閱:https://github.com/vaadin/framework/issues/4341 – mjjaniec

3

您可以將ShortcutListener添加到文本區,像這樣:

TextArea textArea = new TextArea(); 
textArea.addShortcutListener(enter); 

現在你只需要如下初始化一些ShortcutListener:

ShortcutListener enter = new ShortcutListener("Enter", KeyCode.ENTER, null) { 

     @Override 
     public void handleAction(Object sender, Object target) { 
      // Do nice stuff 
      log.info("Enter pressed"); 
     } 
    }; 
+0

我也建議只添加偵聽器,而textarea只有焦點。您可以使用焦點偵聽器添加它並使用模糊偵聽器將其刪除。 –

0

對於這一點,我們用下面的效用函數

/** 
* Perform the specified action when the text field has focus and `ENTER` is pressed. 
* 
* @param tf The {@link com.vaadin.ui.TextField text field} or 
* {@link com.vaadin.ui.TextArea text area) 
* @param action The action to perform 
*/ 
public static void onKeyEnter(AbstractTextField tf, Consumer<AbstractTextField> action) { 
    tf.addFocusListener(event -> { 
     final Registration r = tf.addShortcutListener(
      new ShortcutListener("Enter", KeyCode.ENTER, null) { 

       @Override 
       public void handleAction(Object sender, Object target) { 
        // sender: UI, target: TextField 
        assert target == tf; 
        action.accept(tf); 
       } 
      }); 
     tf.addBlurListener(e -> r.remove()); 
    });   
} 

要使用它:

final TextField searchField = new TextField(); // or TextArea 
searchField.setPlaceholder("Search text (ENTER)..."); 
// .. 
onKeyEnter(searchField, tf -> doSearch(tf.getValue()));