2013-11-28 19 views
8

Sto usando un Vaadin TextArea come una console approssimativa. L'utente può immettere comandi che devono essere eseguiti quando preme il tasto Invio. C'è un modo per specificare questo con un listener su TextArea?Come rilevare la pressione del tasto enter in vaadin TextArea

La cosa più vicina che ho trovato è quello di utilizzare:

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

E gestire l'evento di modifica del testo:

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

Questo è comunque attivato non appena il testo è stato inserito nel TextArea. Vorrei essere informato solo quando è stato premuto il tasto Invio.

risposta

13

Non si può ascoltare tasti di scelta rapida sulla textarea in sé, ma una soluzione semplice sarebbe quella di aggiungere un pulsante di invio e utilizzare entrare come è scorciatoia:

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

È possibile nascondere il pulsante stesso se don' t desiderio è:

b.setVisible(false); 

Un'altra soluzione sarebbe quella di utilizzare ShortcutActions e gestori, come descritto qui: https://vaadin.com/book/-/page/advanced.shortcuts.html

In ogni caso, è necessario tenere conto del fatto che l'ascolto del tasto Invio causerà un conflitto quando si utilizza un componente TextArea perché è necessario utilizzare la stessa chiave per passare alla riga successiva in TextArea.

+0

Purtroppo questa soluzione non funziona più. Vedi: https://github.com/vaadin/framework/issues/4341 – mjjaniec

3

È possibile aggiungere uno ShortcutListener al TextArea, in questo modo:

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

Ora devi solo per inizializzare alcuni ShortcutListener come segue:

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

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

Vorrei anche suggerire di aggiungere solo l'ascoltatore mentre la textarea è focalizzata. Puoi farlo usando un ascoltatore di messa a fuoco per aggiungerlo e un listener di sfocatura per rimuoverlo. –

0

Per questo, si usa la funzione di utilità seguente

/** 
* 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()); 
    });   
} 

Per utilizzarlo:

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