【问题标题】:How to detect enter key press in vaadin TextArea如何检测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 中输入了文本,就会触发此操作。我希望仅在按下回车键时收到通知。

【问题讨论】:

    标签: java textarea vaadin keypress


    【解决方案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 中的下一行。

    【讨论】:

    【解决方案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));
          });
        }
      

      【讨论】:

        猜你喜欢
        • 2019-09-16
        • 2013-02-04
        • 1970-01-01
        • 1970-01-01
        • 2012-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多