我使用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());
}
然而,一旦文本在文本区域中输入,就会触发此操作。我希望只有在按下回车键时才收到通知。
您无法监听文本区域本身的快捷键,但一个简单的解决方案是添加一个提交按钮并使用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()));