使用回车键传递字段?

时间:2014-01-27 17:43:19

标签: java frameworks vaadin vaadin7

我正在寻找一种在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 
    }
}

}

任何想法?

2 个答案:

答案 0 :(得分:1)

没有接口可以提供一个访问器,可以让你找到当前关注的组件。可以通过com.vaadin.event.FieldEvents.FocusListenercom.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);