2010-09-13 48 views
0

我在尝试管理GWT对话框中的焦点时非常糟糕。我试图将一个非常友好的键盘界面放在一起,所以当我的对话框出现时(简单的是/否/取消事件),我需要让键盘焦点自动转到“是”按钮。然而,尽管我尽了最大的努力,但似乎无法在需要编程的地方争论焦点。我的代码现在看起来像这样: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??? 
    } 
} 

省略:许多按钮单击事件处理gook,不影响初始显示。

无论如何,从代码中可以看到,其意图是一旦显示对话框,“yes”按钮就会获得焦点。我已经试过了,如代码示例中所示,我已将焦点放在DeferredCommand中,我尝试过钩住其他事件......但最好的焦点有点随机。我想它可能只是一个时间问题(也许我试图专注于按钮之前,它已被添加到DOM?),但如果是这样我不知道我应该看什么让我知道我什么时候可以有效地给按钮焦点。任何提示?

谢谢!

回答

3

你需要重写onPreviewNativeEvent方法,我在你的PopupPanel /对话框如下进行:

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

这将允许您捕捉重要事件,而正在显示一个PopupPanel。

+0

不幸的是,现在我已经转移到其他项目上,所以我怀疑我会有机会实现这个一会儿,但是谢谢你! – Toji 2011-05-03 13:52:18

+0

尽管此解决方案可行,但它不会按预期工作。如果焦点位于'取消'或'否'按钮上,无论如何都会点击'是'按钮。 – 2014-04-04 21:20:58

0

您可以尝试使用setTabIndex代替。

cancelBtn.setTabIndex(2); 
noBtn.setTabIndex(1); 
yesBtn.setTabIndex(0); 
+0

不知道这将解决这个问题,但它确实帮我解决不同的问题,我与码头面板一起使用,非常感谢!无论哪种方式,明天我都会试一试。 – Toji 2010-09-28 02:38:21

+1

对不起,忘记了这张票。对于记录设置,选项卡索引对最初关注的内容没有任何影响。抱歉。 (就像我说的那样,它确实帮助我解决了一个无关的问题,所以谢谢!) – Toji 2010-10-13 00:41:07

4

如果你想获得焦点,而不是捕捉到关键事件,需要推迟的setFocus这样的:

@Override 
public void show() { 
    super.show(); 

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