2013-11-28 15 views
8

Ich verwende eine vaadin TextArea als grobe Konsole. Der Benutzer kann Befehle eingeben, die ausgeführt werden sollen, wenn er die Eingabetaste drückt. Gibt es eine Möglichkeit, dies mit einem Listener in der TextArea anzugeben?So erkennen Sie die Eingabetaste Drücken Sie in vaadin TextArea

Die nächste Sache fand ich zu bedienen:

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

Und den Text ändern Ereignis behandeln:

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

Dies jedoch wird ausgelöst, sobald Text in der Textarea eingegeben wurde. Ich möchte nur benachrichtigt werden, wenn die Eingabetaste gedrückt wurde.

Antwort

13

Sie können nicht hören Tasten auf dem Text abzukürzen selbst, sondern eine einfache Lösung wäre, einen Submit-Button hinzufügen und eingeben, wie er Abkürzung ist:

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

Sie auf die Schaltfläche sich verstecken können, wenn Sie don‘ t es wünschen:

b.setVisible(false); 

Eine andere Lösung wäre ShortcutActions zu verwenden und Handlers wie hier beschrieben: https://vaadin.com/book/-/page/advanced.shortcuts.html

In beiden Fällen müssen Sie jedoch berücksichtigen, dass das Abhören der Eingabetaste einen Konflikt verursacht, wenn Sie eine TextArea-Komponente verwenden, da Sie auch denselben Schlüssel verwenden müssen, um zur nächsten Zeile in der TextArea zu gelangen.

+0

Leider funktioniert diese Lösung nicht mehr. Siehe: https://github.com/vaadin/framework/issues/4341 – mjjaniec

3

Sie können eine ShortcutListener zum TextArea- hinzuzufügen, wie folgt aus:

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

Jetzt müssen Sie nur noch einige ShortcutListener initialisieren wie folgt:

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

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

Ich würde auch vorschlagen, nur den Hörer nur hinzuzufügen, während der Textbereich Fokus hat. Sie können dazu einen Fokus-Listener verwenden, um ihn hinzuzufügen, und einen Unschärfe-Listener, um ihn zu entfernen. –

0

Hierzu verwenden wir die folgenden Nutzenfunktion

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

es zu benutzen:

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