提问者:小点点

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


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

然而,一旦文本在文本区域中输入,就会触发此操作。我希望只有在按下回车键时才收到通知。


共3个答案

匿名用户

您无法监听文本区域本身的快捷键,但一个简单的解决方案是添加一个提交按钮并使用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);

另一种解决方案是使用快捷操作和处理程序,如下所述:https://vaadin.com/book/-/page/advanced.shortcuts.html

但是无论哪种情况,您都必须考虑到在使用TextArea组件时监听回车键会导致冲突,因为您还需要使用相同的键才能到达TextArea中的下一行。

匿名用户

您可以向TextArea添加一个快捷监听器,如下所示:

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

现在您只需按如下方式初始化一些SHOTCUListener:

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

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

匿名用户

为此,我们使用以下效用函数

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