我正在为Eclipse编写一个带有一些页面的小向导,我需要抓住第一次显示页面的那一刻。
我检查了构造函数和createControl
,但它们在Wizard
对象(addPages
)的创建时刻被调用。
有没有办法得到我需要的东西?也许有人知道一些技巧?
答案 0 :(得分:3)
您可以在WizardPage中覆盖setVisible(boolean)方法。例如,使用类似的东西:
private boolean initialized = false;
@Override
public void setVisible(boolean visible) {
if (!initialized && visible) {
//do something
initialized = true;
}
control.setVisible(visible);
}
答案 1 :(得分:2)
您可以使用WizardDialog上注册的IPageChangedListener
或IpageChangingListener
。当向导的当前页面发生更改时,将通知他们。
答案 2 :(得分:1)
我更喜欢在第一次绘画后删除侦听器。这样你就不需要额外的布尔字段了,你可以避免不必要的调用paintControl并每次检查那个布尔值。
container.addPaintListener(new PaintListener()
{
@Override
public void paintControl(PaintEvent e)
{
doUsefulStuff();
container.removePaintListener(this);
}
});
答案 3 :(得分:0)
好的,我为一个paint事件创建了一个监听器,并使用了一个标志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();
}
}
});
...
}
对我来说没问题。
答案 4 :(得分:0)
控件创建后执行异步UI任务,执行长init操作。 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
}
}
});
}