2009-06-09 53 views
4

現在,我在第一頁選擇我am able to set the content of my second wizard's page depending,我正在尋找一種方式,當用戶點擊第一頁上的下一個按鈕時,我的第二頁的內容的焦點。Eclipse JFace的奇才(再次...)

默認情況下,當用戶點擊下一步按鈕,焦點就轉移到按鈕組合(未來,背部或根據嚮導配置完成按鈕)

的唯一途徑,我發現焦點賦予我的頁面的內容是以下之一:

public class FilterWizardDialog extends WizardDialog { 

    public FilterWizardDialog(Shell parentShell, IWizard newWizard) { 
     super(parentShell, newWizard); 
    } 

    @Override 
    protected void nextPressed() { 
     super.nextPressed(); 
     getContents().setFocus(); 
    } 
} 

對我來說這是一個有點「悶重」有覆蓋,以實現這一行爲的WizardDialog類。更結束了,WizardDialog的javadoc說:

客戶可以繼承WizardDialog,雖然這是很少需要。

您對這個解決方案有什麼看法?有沒有更簡單更清潔的解決方案來完成這項工作?

回答

7

thread提示:

在你的嚮導頁中,使用繼承setVisible()方法時自動調用顯示你的頁面之前:

public void setVisible(boolean visible) { 
    super.setVisible(visible); 
    // Set the initial field focus 
    if (visible) { 
     field.postSetFocusOnDialogField(getShell().getDisplay()); 
    } 
} 

的postSetFocusOnDialogField方法包括:

/** 
* Posts <code>setFocus</code> to the display event queue. 
*/ 
public void postSetFocusOnDialogField(Display display) { 
    if (display != null) { 
     display.asyncExec(
      new Runnable() { 
       public void run() { 
        setFocus(); 
       } 
      } 
     ); 
    } 
} 
+0

正是我一直在尋找(壞的谷歌搜索我,O)) 感謝。 Manu – 2009-06-09 07:34:53

0

VonC的答案的偉大工程,我個人認爲它是更容易一些一起工作這樣雖然:

@Override 
public void setVisible(boolean visible) { 
    super.setVisible(visible); 
    if (visible) { 
     Control control = getControl(); 
     if (!control.setFocus()) { 
      postSetFocus(control); 
     } 
    } 
} 

private void postSetFocus(final Control control) { 
    Display display = control.getDisplay(); 
    if (display != null) { 
     display.asyncExec(new Runnable() { 
      @Override 
      public void run() { 
       control.setFocus(); 
      } 
     }); 
    } 
}