我使用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中输入了文本,就会触发此操作。我希望只有在按下回车键时才会收到通知。
答案 0 :(得分:15)
你不能听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和Handler,如下所述: https://vaadin.com/book/-/page/advanced.shortcuts.html
但是在任何一种情况下都必须考虑到在使用TextArea组件时监听enter键会导致冲突,因为你还需要使用相同的键来到TextArea中的下一行。
答案 1 :(得分:3)
您可以将ShortcutListener添加到TextArea,如下所示:
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");
}
};
答案 2 :(得分:0)
为此,我们使用以下效用函数
/**
* 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()));
答案 3 :(得分:0)
//针对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));
});
}