Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GWT焦点在对话框中的按钮上_Gwt - Fatal编程技术网

GWT焦点在对话框中的按钮上

GWT焦点在对话框中的按钮上,gwt,Gwt,我在试图管理GWT对话的焦点时遇到了麻烦。我正在尝试建立一个非常友好的键盘界面,因此当我的对话框出现时(一个简单的是/否/取消事件),我需要让键盘焦点自动切换到“是”按钮。然而,尽管我尽了最大的努力,我似乎无法在需要编程的地方争论焦点。我现在的代码如下所示: public abstract class ConfirmDialog extends DialogBox { final Button yesBtn, noBtn, cancelBtn; public ConfirmDi

我在试图管理GWT对话的焦点时遇到了麻烦。我正在尝试建立一个非常友好的键盘界面,因此当我的对话框出现时(一个简单的是/否/取消事件),我需要让键盘焦点自动切换到“是”按钮。然而,尽管我尽了最大的努力,我似乎无法在需要编程的地方争论焦点。我现在的代码如下所示:

public abstract class ConfirmDialog extends DialogBox {
    final Button yesBtn, noBtn, cancelBtn;

    public ConfirmDialog(String title, String prompt) {
        super(false);

        setTitle(title);
        setText(title);
        setGlassEnabled(true); // For great modal-ness!

        DockLayoutPanel buttonPanel = new DockLayoutPanel(Unit.PX);
        buttonPanel.setHeight("25px");
        buttonPanel.addEast(cancelBtn, 75);
        buttonPanel.addEast(noBtn, 60);
        buttonPanel.addEast(yesBtn, 60);

        FlowPanel dialogPanel = new FlowPanel();
        dialogPanel.add(new HTML(prompt));
        dialogPanel.add(buttonPanel);

        setWidget(dialogPanel);
    }

    @Override
    public void show() {
        super.show();
        center();
        yesBtn.setFocus(true); // Why does this hate me???
    }
}
@Override
public void show() {
    super.show();

    Scheduler.get().scheduleDeferred(new Command() {
        public void execute() {
            yesBtn.setFocus(true);
        }
    });
}
省略:大量的按钮点击事件处理程序不影响初始显示

不管怎样,正如您从代码中看到的,其目的是只要显示对话框,“yes”按钮就会获得焦点。我已经试过了,如代码示例所示,我已经把焦点放在了一个DeferredCommand中,我已经试过挂接其他事件。。。但充其量,焦点多少是随机的

我想这可能只是一个时间问题(也许我正试图在按钮被添加到DOM之前关注它?),但如果是这样的话,我就不知道我应该看什么来让我知道何时可以有效地给予按钮焦点。有什么提示吗

谢谢

您可以尝试使用


您需要重写onPreviewNativeEvent方法,正如我在下面的PopupPanel/DialogBox中所做的那样:

protected void onPreviewNativeEvent(Event.NativePreviewEvent event) {
    if(event.getTypeInt() == Event.ONKEYDOWN) {
        if(event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) {
            submitButton.click();
        }
    }
    super.onPreviewNativeEvent(event);
}

这将允许您在显示PopupPanel时捕获关键事件。

如果您希望获得焦点而不是捕获关键事件,则需要如下延迟设置焦点:

public abstract class ConfirmDialog extends DialogBox {
    final Button yesBtn, noBtn, cancelBtn;

    public ConfirmDialog(String title, String prompt) {
        super(false);

        setTitle(title);
        setText(title);
        setGlassEnabled(true); // For great modal-ness!

        DockLayoutPanel buttonPanel = new DockLayoutPanel(Unit.PX);
        buttonPanel.setHeight("25px");
        buttonPanel.addEast(cancelBtn, 75);
        buttonPanel.addEast(noBtn, 60);
        buttonPanel.addEast(yesBtn, 60);

        FlowPanel dialogPanel = new FlowPanel();
        dialogPanel.add(new HTML(prompt));
        dialogPanel.add(buttonPanel);

        setWidget(dialogPanel);
    }

    @Override
    public void show() {
        super.show();
        center();
        yesBtn.setFocus(true); // Why does this hate me???
    }
}
@Override
public void show() {
    super.show();

    Scheduler.get().scheduleDeferred(new Command() {
        public void execute() {
            yesBtn.setFocus(true);
        }
    });
}

不确定这是否能解决问题,但它确实帮助我解决了码头面板的另一个问题,所以谢谢!不管怎样,我明天就试试。对不起,我忘了这张票。对于记录设置,选项卡索引对最初关注的内容没有任何影响。很抱歉(就像我说的,尽管如此,它确实帮助我解决了一个不相关的问题,所以还是要谢谢你!)不幸的是,现在我已经转移到工作中的其他项目,所以我怀疑我是否有机会在一段时间内实现这一点,但还是要谢谢你!虽然这个解决方案会起作用,但它不会像预期的那样起作用。如果焦点集中在“取消”或“否”按钮上,无论如何都会单击“是”按钮。只是好奇,为什么/如何工作?