2010-09-13 25 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); 
     } 
    }); 
}