我正在寻找一种在VerticalLayout或其他方面使用回车键传递字段的方法。在vaadin书中有一个使用Shortcut和Handler监听器的例子,但我不知道如何实现它。
我正在尝试这个。
public class MyWindow extends Window implements Handler{
private Action action_enter; //pass fields with enter
private Action action_esc;
private TextField name, lastName;
public MyWindow(){
super("this window is opened");
VerticalLayout vLayout = new VerticalLayout();
setContent(vLayout);
center();
setModal(true);
setClosable(false);
setDraggable(false);
setResizable(false);
//actions
action_enter = new ShortcutAction("Enter key", ShortcutAction.KeyCode.ENTER, null);
action_esc = new ShortcutAction("Esc key", ShortcutAction.KeyCode.ESCAPE, null);
addActionHandler(this);
//fields
name = new TextField("Name");
lastName = new TextField("Last name");
name.focus();
vLayout.addComponent(name);
vLayout.addComponent(lastName);
}
@Override
public Action[] getActions(Object target, Object sender) {
return new Action[] { action_enter, action_esc };
}
@Override
public void handleAction(Action action, Object sender, Object target) {
/** close window with esc key */
if(action == action_esc){
close();
}
/** pass fields with enter key */
if(action == action_enter){
//here pass fields with enter key
}
}
}
任何想法?
答案 0 :(得分:1)
没有接口可以提供一个访问器,可以让你找到当前关注的组件。可以通过com.vaadin.event.FieldEvents.FocusListener
和com.vaadin.event.FieldEvents.BlurListener
接口为某些(但不是所有)字段组件获取焦点信息。
您可以为所有可能的字段添加FocusListener
并记住每次调用它时,变量中的当前字段。 (问题:并非所有字段都提供FocusListener。)然后当按下ENTER时,根据当前聚焦的字段(记住变量)聚焦下一个组件,该字段必须被聚焦(借助于简单的List,LinkedList,Map,switch - 等等)。为了更好地添加BlurListener
,还要知道何时不要关注下一个字段。
希望有所帮助。
答案 1 :(得分:1)
使用ShortcutListener尝试这种方式:
ShortcutListener skEnterListener = new ShortcutListener("Enter", ShortcutAction.KeyCode.ENTER, null){
@Override
public void handleAction(Object sender, Object target) {
if (target instanceof VerticalLayout) { // VerticalLayout or other
// sending fileds here
}
}
};
addShortcutListener(skEnterListener);
使用Enter而不是Tab键更改TextField的焦点:
final TextField tf1 = new TextField("tf1");
tf1.setId("tf1");
final TextField tf2 = new TextField("tf2");
tf2.setId("tf2");
ShortcutListener skEnterListener = new ShortcutListener("Enter", ShortcutAction.KeyCode.ENTER, null){
@Override
public void handleAction(Object sender, Object target) {
if (target instanceof TextField) {
TextField field = (TextField) target;
if ("tf1".equals(field.getId())) {
tf2.focus();
}
if ("tf2".equals(field.getId())) {
tf1.focus();
}
}
}
};
addShortcutListener(skEnterListener);