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

이 그러나 트리거를

내가 찾은 가장 가까운 것은 사용하는 것입니다. 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); 

t는 소원 :

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

텍스트 영역에 포커스가있는 동안에 만 리스너를 추가하는 것이 좋습니다. 포커스 리스너를 사용하여 추가 할 수 있으며 흐림 수신기를 사용하여 제거 할 수 있습니다. –

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())); 
관련 문제