如何检测vaadin TextArea中的输入按键

Posted

技术标签:

【中文标题】如何检测vaadin TextArea中的输入按键【英文标题】:How to detect enter key press in vaadin TextArea 【发布时间】:2013-12-14 07:38:22 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

不幸的是,这个解决方案不再有效。见:github.com/vaadin/framework/issues/4341【参考方案2】:

您可以向 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");
    
;

【讨论】:

我还建议仅在 textarea 具有焦点时才添加侦听器。您可以使用焦点侦听器来添加它并使用模糊侦听器来移除它。【参考方案3】:

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

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

【讨论】:

【参考方案4】:

//为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));
    );
  

【讨论】:

以上是关于如何检测vaadin TextArea中的输入按键的主要内容,如果未能解决你的问题,请参考以下文章

Vaadin Textarea 自动高度

Vaadin:TextArea 滚动不起作用

使用 JS 或 Jquery 检测 textarea 中的 url

如何阻止在textarea中输入回车?

GPIO输入——按键检测

如何检测 Python 进程中的按键?