5

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

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

有没有办法得到我需要的东西?也许有人知道一些技巧?

4

5 回答 5

4

您可以在 WizardPage 中覆盖 setVisible(boolean) 方法。因此,例如使用类似的东西:

private boolean initialized = false;

@Override
public void setVisible(boolean visible) {
    if (!initialized && visible) {
        //do something
        initialized = true;
    }
    control.setVisible(visible);
}
于 2012-04-30T18:12:00.987 回答
2

您可以使用在WizardDialog上注册的aIPageChangedListener或 a 。当向导的当前页面发生更改时,他们将收到通知。IpageChangingListener

于 2012-04-24T17:51:00.617 回答
1

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

container.addPaintListener(new PaintListener()
{
    @Override
    public void paintControl(PaintEvent e)
    {
        doUsefulStuff();
        container.removePaintListener(this);
    }
});
于 2014-12-08T09:53:45.113 回答
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();
            }
        }
    });
...
}

对我来说没问题。

于 2012-05-03T13:42:18.550 回答
0

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

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
            }
        }
    });
}
于 2016-03-24T11:32:18.367 回答