在GWT中有没有办法为整个视图而不是单个输入元素创建KeyPressEvent?

时间:2012-03-08 14:54:06

标签: java gwt uibinder

现在我有以下代码:

@UiHandler("usernameTextBox")
void onUsernameTextBoxKeyPress(KeyPressEvent event) {
    keyPress(event);
}

@UiHandler("passwordTextBox")
void onPasswordTextBoxKeyPress(KeyPressEvent event) {
    keyPress(event);
}

void keyPress(KeyPressEvent event) {
    if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) {
        submit();
    }
}

我希望能够为视图中的所有元素只有一个侦听器,而不会为每个文本框复制一个事件。

最终目标是,如果他们按Enter键,无论他们在页面上的哪个位置,都应该提交表单。

谢谢!

3 个答案:

答案 0 :(得分:7)

什么有效,但仍需要您为每个小部件指定它,但不需要重复的代码:

@UiHandler({"usernameTextBox", "passwordTextBox"})
void onPasswordTextBoxKeyPress(KeyPressEvent event) {
    keyPress(event);
}

答案 1 :(得分:2)

是的夹套是正确的。您也可以尝试以下方法。它可能是VerticalPanel,DockLayoutPanel等......

UiBinder.ui.xml

<gwt:VerticalPanel ui:field="mainPanel">
    <gwt:Label>Name</gwt:TextBox>
    <gwt:TextBox ui:field="textBox">
</gwt:VerticalPanel>

Main.java

@UiField
VerticalPanel mainPanel;

public Main() {
  focushandler();
}

void focusHandler() { 
    mainPanel.addDomHandler(new Handler(), KeyPressEvent.getType());
}

final class Handler implements KeyPressHandler {

    @Override
    public void onKeyPress(KeyPressEvent event) {
        //Code what you expect
    }
}

实际上这有更多行。但这是一种很好的做法。

此致 Gnik

答案 2 :(得分:1)

我发现g:FocusPanel允许我捕捉面板内部所有事件。

@UiHandler("focusPanel")
void onFocusPanelKeyPress(KeyPressEvent event) {
    if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) {
        submit();
    }
}