2013-11-28 2 views
8

Я использую vaadin TextArea как грубую консоль. Пользователь может вводить команды, которые должны выполняться, когда он нажимает клавишу ввода. Есть ли способ указать это с помощью прослушивателя TextArea?Как определить ввод нажатия клавиши в ваадине TextArea

Ближайший вещь, которую я нашел, чтобы использовать:

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

И обрабатывать событие изменения текста:

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

Это, однако, срабатывает как только текст был введен в TextArea. Я хотел бы получать уведомления только после нажатия клавиши ввода.

ответ

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 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())); 
Смежные вопросы