2013-11-28 10 views
8

私は荒いコンソールとしてvaadin TextAreaを使用しています。ユーザは、エンターキーを押したときに実行すべきコマンドを入力することができる。 TextAreaのリスナーでこれを指定する方法はありますか?vaadinのEnterキーの検出方法TextArea

私が見つけた最も近いものを使用することです:

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

とテキストの変更イベントを処理:

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

これは、しかし、すぐにテキストがTextAreaの中で入力されたとしてトリガされます。 Enterキーが押された場合にのみ通知を受けたいと思います。

答えて

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

あなたはこのように、TextAreaのに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

テキストエリアにフォーカスがある場合にのみリスナーを追加することもお勧めします。フォーカスリスナーを追加するにはフォーカスリスナーを、削除するにはぼかしリスナーを使用します。 –

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())); 
関連する問題