GWT焦点在对话框中的按钮上
我在试图管理GWT对话的焦点时遇到了麻烦。我正在尝试建立一个非常友好的键盘界面,因此当我的对话框出现时(一个简单的是/否/取消事件),我需要让键盘焦点自动切换到“是”按钮。然而,尽管我尽了最大的努力,我似乎无法在需要编程的地方争论焦点。我现在的代码如下所示:GWT焦点在对话框中的按钮上,gwt,Gwt,我在试图管理GWT对话的焦点时遇到了麻烦。我正在尝试建立一个非常友好的键盘界面,因此当我的对话框出现时(一个简单的是/否/取消事件),我需要让键盘焦点自动切换到“是”按钮。然而,尽管我尽了最大的努力,我似乎无法在需要编程的地方争论焦点。我现在的代码如下所示: public abstract class ConfirmDialog extends DialogBox { final Button yesBtn, noBtn, cancelBtn; public ConfirmDi
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);
}
});
}
不确定这是否能解决问题,但它确实帮助我解决了码头面板的另一个问题,所以谢谢!不管怎样,我明天就试试。对不起,我忘了这张票。对于记录设置,选项卡索引对最初关注的内容没有任何影响。很抱歉(就像我说的,尽管如此,它确实帮助我解决了一个不相关的问题,所以还是要谢谢你!)不幸的是,现在我已经转移到工作中的其他项目,所以我怀疑我是否有机会在一段时间内实现这一点,但还是要谢谢你!虽然这个解决方案会起作用,但它不会像预期的那样起作用。如果焦点集中在“取消”或“否”按钮上,无论如何都会单击“是”按钮。只是好奇,为什么/如何工作?