Поскольку вы говорите о закрытии shell
и т. Д., Я предполагаю, что вы уже выяснили, выбор является IP-проектом и отображает ошибку .
Закрытие мастера:
Все стандартные мастера реализуют абстрактные org.eclipse.jface.wizard.Wizard
. Если вы хотите закрыть его, просто вызовите его метод performCancel()
. (я не знал, что вы вызываете getShell().close()
в init()
)
Обновление:
Причина проста. Когда вы выбираете определенного мастера в мастере import
и нажимаете «Далее», из org.eclipse.jface.wizard.WizardSelectionPage
вызывается следующий метод
public IWizardPage getNextPage()
{
if (selectedNode == null) {
return null;
}
boolean isCreated = selectedNode.isContentCreated();
IWizard wizard = selectedNode.getWizard(); // THIS WILL CALL THE INIT
if (wizard == null) {
setSelectedNode(null);
return null;
}
if (!isCreated) {
// Allow the wizard to create its pages
wizard.addPages(); // THIS IS ADDING THE EXTRA PAGES
}
return wizard.getStartingPage();
}
Как вы можете видеть, оператор IselectedNode.getWizard();
приходит раньше, чем wizard.addPages();
, поэтому даже если вы определили, что выбор не является IProject
и называется performCancel()
(что не будет иметь никакого эффекта в качестве dialog-content- сама область не создается) она все равно будет переходить на wizard.addPages();
.
Как вы уже заметили, getShell()
в методе init()
вернет null
. Чтобы решить эту проблему (к сожалению), вы должны переопределить public void createPageControls(Composite pageContainer)
, , но не волнуйтесь, требуемое изменение минимально:
public void createPageControls(Composite pageContainer) {
if(flag){
getShell().close();
return;
}
super.createPageControls(pageContainer);
}
Для справки см. Полный код ниже:
public class MyImportWizard extends Wizard implements IImportWizard {
private IProject project = null;
private boolean flag = false;
public void addPages() {
if(!flag)
System.out.println("Hello");
}
public void createPageControls(Composite pageContainer) {
if(flag){
getShell().close();
return;
}
super.createPageControls(pageContainer);
}
public void init(IWorkbench workbench, IStructuredSelection selection)
{
project = null;
if (selection.size() > 0) {
Object obj = selection.getFirstElement();
if (obj instanceof IResource) {
IResource resource = (IResource)obj;
if (obj instanceof IProject)
project = (IProject)obj;
else
project = resource.getProject();
}
}
if (project == null) {
MessageDialog.openError(
getShell(),
"GetPack Wizard",
"You must run this wizard from a project."
);
flag = true;
}
}
@Override
public boolean performFinish() {
return true;
}
}
Попробуйте, а пока я посмотрю, можно ли сделать это более изощренно.