我正在努力将重点放在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???
}
}
省略:许多按钮点击事件处理不会影响初始显示。
无论如何,正如您从代码中看到的那样,目的是一旦显示对话框,“是”按钮就会获得焦点。我已经尝试了它,如代码示例中所示,我已将焦点放在DeferredCommand中,我已尝试挂钩其他事件......但最好的焦点有点随机。
我想这可能只是一个时间问题(也许我在将它添加到DOM之前尝试将重点放在按钮上?)但是如果是这样的话我就不知道应该注意什么了我知道什么时候我可以有效地给按钮重点。任何提示?
谢谢!
答案 0 :(得分:5)
如果你想获得焦点而不是捕获关键事件,你需要像这样推迟setFocus:
@Override
public void show() {
super.show();
Scheduler.get().scheduleDeferred(new Command() {
public void execute() {
yesBtn.setFocus(true);
}
});
}
答案 1 :(得分:3)
你需要覆盖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时捕获关键事件。
答案 2 :(得分:0)
您可以尝试使用setTabIndex代替。
cancelBtn.setTabIndex(2);
noBtn.setTabIndex(1);
yesBtn.setTabIndex(0);