gpt4 book ai didi

java - 允许向导仅从现有项目运行

转载 作者:行者123 更新时间:2023-11-30 09:49:17 26 4
gpt4 key购买 nike

我正在为 Eclipse 插件做导入向导。

It should be allowed only if the selection is an IProject and display an error (and close itself) otherwise.

你知道这怎么可行吗?

我尝试使用 OwnWizard.init(.. .) 方法,如果选择不是 IProject,但我得到一个关于 getShell()NullPointerException(看起来它不是仍然有效)。

我试过这个片段:

public class GetPackWizard extends Wizard implements IImportWizard {
private IProject project = null;
// ...
@Override
public void addPages() {
logger.trace("Adding pages.");
addPage(new SelectPackagesWizardPage(project));
versionsPage = new SelectVersionsWizardPage(project);
addPage(versionsPage);
}

//...
@Override
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."
);
performCancel();
}
}

虽然向导关闭了,但是 addPages() 方法仍然被调用,从而导致一些 NullPointerException(因为 project 字段为 null ).

有什么办法可以防止这种情况发生?如果我不必重新实现 createControls() 向导方法,那就太好了:)

谢谢你的帮助,

最好的问候,

格雷格*。

最佳答案

由于您正在谈论关闭 shell 等,因此我假设您已经知道selection 是一个 IProject 并显示错误.

关闭向导:

所有标准向导都实现了抽象 org.eclipse.jface.wizard.Wizard。如果你想关闭它,只需调用它的 performCancel() 方法。 (我不知道你正在调用 getShell().close() 初始化())


更新:

原因很简单。当您在 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-area 本身没有创建)它仍然会继续到 wizard.addPages ();.

您已经注意到 init() 方法中的 getShell() 将返回 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;
}
}

试一试,同时我会看看是否可以用更复杂的方式来完成。

关于java - 允许向导仅从现有项目运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5885454/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com