2009-06-09 3 views
4

첫 번째 페이지 선택에서 I가 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 클래스를 오버라이드 (override) 할 수 있습니다. 더 이상, WizardDialog javadoc은 다음과 같이 말합니다 :

클라이언트는 서브 클래스가 WizardDialog 일 수 있습니다.

이 솔루션에 대해 어떻게 생각하십니까? 그 일을하기에 더 쉽고 깨끗한 해결책이 있습니까?

답변

7

thread는 제안 :

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

postSetFocusOnDialogField 방법이 포함되어 있습니다 :

당신의 마법사 페이지에서 페이지가 표시되기 전에 자동으로 호출되는 상속 setVisible() 방법을 사용

/** 
* 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

) 감사합니다. 마누 –

+0

@ 마누엘 : 오신 것을 환영합니다. 나는 당신 덕분에 마법사에 대해 배우고있다;) – VonC

0

VonC의 대답은 내가 개인적이 생각처럼 작동하도록 좀 더 쉽게 것으로 발견, 잘 작동 :

나는 (나에게 나쁜 인터넷 검색; O)을 찾고 있었다 그냥 어떤
@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(); 
      } 
     }); 
    } 
} 
관련 문제