2012-04-24 2 views
4

일부 페이지가있는 Eclipse 용 작은 마법사를 작성 중이며 처음 페이지를 표시하는 순간을 알아야합니다.WizardPage의 처음 표시 방법을 잡는 방법

생성자와 createControl을 검사했지만 Wizard 개체 (addPages)의 생성 순간에 호출되었습니다.

내가 필요한 것을 얻을 수있는 방법이 있습니까? 누군가 트릭을 알고 있나?

답변

2

WizardDialog에 등록 된 IPageChangedListener 또는 IpageChangingListener을 사용할 수 있습니다. 마법사의 현재 페이지가 변경되면 알림이 전송됩니다.

+0

는'WizardDialog', 나는'org.eclipse.jface.wizard.Wizard'와'org.eclipse.ui.INewWizard'를 사용합니다. 그리고이 경우'IPageChangedListener' 나'IpageChangingListener'를 어떻게 사용할 지 모르겠습니다. – morbilli

+0

@ user433689'WizardDialog'를 얻기 위해'Wizard.getContainer()'를 사용하십시오. – Baldrick

+0

좋아, 시도해 보겠습니다. – morbilli

3

WizardPage에서 setVisible (boolean) 메서드를 재정의 할 수 있습니다. 그래서 예를 들어 같은 것을 사용

private boolean initialized = false; 

@Override 
public void setVisible(boolean visible) { 
    if (!initialized && visible) { 
     //do something 
     initialized = true; 
    } 
    control.setVisible(visible); 
} 
+0

고맙습니다. 다른 방법을 사용했습니다. – morbilli

0

확인을, 나는 페인트 이벤트에 대한 리스너를 작성 마법사 클래스에서 제어 플래그 m_isFirsTime, 사용 :

public void createControl(Composite parent) { 
    Composite container = new Composite(parent, SWT.NONE); 

    setControl(container); 
    container.addPaintListener(new PaintListener() { 
     @Override 
     public void paintControl(PaintEvent arg0) { 
      if (m_isFirstTime) { 
       m_isFirstTime = false; 
       StartXMLParsing(); 
      } 
     } 
    }); 
... 
} 

그것은 나에 대한 확인이다.

1

먼저 그림을 그린 후에 청취자를 제거하는 것을 선호합니다. 그렇게하면 추가 부울 필드가 필요없고 불필요한 paintControl 호출을 피하고 매번 부울 값을 확인할 수 있습니다. 내가 사용하지 않는

container.addPaintListener(new PaintListener() 
{ 
    @Override 
    public void paintControl(PaintEvent e) 
    { 
     doUsefulStuff(); 
     container.removePaintListener(this); 
    } 
}); 
0
public void createControl(Composite parent) { 
    // create controls 
    getContainer().getShell().getDisplay().asyncExec(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       getContainer().run(false, false, new IRunnableWithProgress() { 
        @Override 
        public void run(IProgressMonitor arg0) throws InvocationTargetException, InterruptedException { 
         // init and validate controls here 
        } 
       }); 
      } catch (InvocationTargetException e) { 
       // handle e.getCause(); 
      } catch (InterruptedException e) { 
       // nothing 
      } 
     } 
    }); 
} 
+2

해결책을 설명해주세요! – gaRos

+0

컨트롤이 생성 된 후 비동기 UI 작업이 실행되어 긴 init 작업을 수행 할 수 있습니다. UI가 이미 생성되어 Runnable이 시작될 때 표시되므로 마법사가 즉시 표시되고 사용자가 초기화 진행 상황을 볼 수 있습니다. –

+0

나를 위해이 설명을 답안에 넣으십시오. 누군가 확인하면 해결 방법이 표시됩니다. – gaRos