如何在vaadin TextArea中检测输入键按下

时间:2013-11-28 10:13:13

标签: java textarea vaadin keypress

我使用vaadin 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中输入了文本,就会触发此操作。我希望只有在按下回车键时才会收到通知。

4 个答案:

答案 0 :(得分:15)

你不能听textarea本身的快捷键,但一个简单的解决方案就是添加一个提交按钮并使用enter作为它的快捷方式:

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和Handler,如下所述: https://vaadin.com/book/-/page/advanced.shortcuts.html

但是在任何一种情况下都必须考虑到在使用TextArea组件时监听enter键会导致冲突,因为你还需要使用相同的键来到TextArea中的下一行。

答案 1 :(得分: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");
    }
};

答案 2 :(得分: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()));

答案 3 :(得分:0)

//针对vaadin 7重构

 public static void onKeyEnter(AbstractTextField tf, Consumer<AbstractTextField> action) {
    tf.addFocusListener(event -> {
      ShortcutListener scl = new ShortcutListener("Enter", KeyCode.ENTER, null) {
        public void handleAction(Object sender, Object target) {
          assert target == tf;
          action.accept(tf);
        }
      };
      tf.addShortcutListener(scl);
      tf.addBlurListener(e -> tf.removeShortcutListener(scl));
    });
  }