Java 如何捕获向导页面的第一次显示

Java 如何捕获向导页面的第一次显示,java,eclipse-plugin,swt,wizard,Java,Eclipse Plugin,Swt,Wizard,我正在为Eclipse编写一个带有一些页面的小向导,我需要抓住第一次显示页面的时刻 我检查了构造函数和createControl,但它们在向导的对象(addPages)中的创建时刻被调用 有办法得到我需要的东西吗?也许有人知道一些诀窍?您可以使用在上注册的IPageChangedListener或IpageChangingListener。当向导的当前页面更改时,将通知他们。您可以覆盖向导页面中的setVisible(布尔)方法。例如,使用以下内容: private boolean initia

我正在为Eclipse编写一个带有一些页面的小向导,我需要抓住第一次显示页面的时刻

我检查了构造函数和
createControl
,但它们在
向导的
对象(
addPages
)中的创建时刻被调用


有办法得到我需要的东西吗?也许有人知道一些诀窍?

您可以使用在上注册的
IPageChangedListener
IpageChangingListener
。当向导的当前页面更改时,将通知他们。

您可以覆盖向导页面中的setVisible(布尔)方法。例如,使用以下内容:

private boolean initialized = false;

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

好的,我为绘画事件创建了一个监听器,并使用了一个标志
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();
            }
        }
    });
...
}

这对我来说没关系。

我更喜欢在第一次绘画后移除监听器。这样,您就不需要额外的布尔字段,并且避免了不必要的调用paintControl和每次检查该布尔值

container.addPaintListener(new PaintListener()
{
    @Override
    public void paintControl(PaintEvent e)
    {
        doUsefulStuff();
        container.removePaintListener(this);
    }
});

创建控件后,将执行异步UI任务,其中可以执行长初始化操作。Runnable启动时已创建并显示UI,因此向导立即出现,用户可以看到初始化进度:

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
            }
        }
    });
}

我不使用
WizardDialog
,而是使用
org.eclipse.jface.wizard.wizard
org.eclipse.ui.INewWizard
。在这种情况下,我不知道如何使用
IPageChangedListener
IpageChangingListener
。@user433689使用
Wizard.getContainer()
检索
向导对话框
谢谢,我使用了另一种方法请解释您的解决方案!创建控件后,将执行异步UI任务,其中可以执行长初始化操作。当Runnable启动时,UI已经创建并显示,因此向导会立即出现,用户可以看到初始化过程。我的意思是,对我来说不是,请将此解释放入您的答案中以使其完整,如果有人检查它,他将看到您的解决方案工作的原因。