如何检测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中的输入按键的主要内容,如果未能解决你的问题,请参考以下文章