2012-04-24 2 views
4

Я пишу маленький мастер для Eclipse с некоторыми страницами, и мне нужно уловить момент отображения первой страницы.Как поймать первое отображение WizardPage

Я проверил конструктор и createControl, но они вызываются в момент создания объекта Wizard (addPages).

Есть ли способ получить то, что мне нужно? Может, кто-нибудь знает какой-то трюк?

ответ

2

Вы можете использовать IPageChangedListener или IpageChangingListener, зарегистрированные на WizardDialog. Они будут уведомлены при изменении текущей страницы мастера.

+0

Я не использую 'WizardDialog', я использую' 'org.eclipse.jface.wizard.Wizard' и org.eclipse.ui.INewWizard'. И я не знаю, как использовать в этом случае 'IPageChangedListener' или' IpageChangingListener'. – morbilli

+0

@ user433689 использовать 'Wizard.getContainer()' для извлечения 'WizardDialog' – Baldrick

+0

Хорошо, я попробую, спасибо. – morbilli

3

Вы можете переопределить метод setVisible (boolean) в WizardPage. Так, например, использовать что-то вроде:

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, которая контролировала от класса Wizard:

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

После того, как элементы управления создали задачу асинхронного пользовательского интерфейса, выполняемую там, где может выполняться длительная операция инициализации. Пользовательский интерфейс уже создан и показан при запуске Runnable, поэтому мастер появляется немедленно, и пользователь может видеть ход инициализации. –

+0

Я имею в виду не для меня, объясните это объяснение в своем ответе, чтобы убедиться, что кто-нибудь его проверит, он увидит, почему ваше решение работает. – gaRos

Смежные вопросы