2012-07-19 90 views
2

我一直试图在eclipse中以编程方式调用刷新(F5)并获取NotHandledException,处理程序未找到错误。帮助将不胜感激。如何在页面关闭后以编程方式调用Eclipse F5刷新

在我的课:NewPreferencePage扩展PreferencePage实现IWorkbenchPreferencePage 我有以下代码:

@Override   
public void dispose() { 

    super.dispose(); 

    final String COMMAND_ID = "org.eclipse.ui.file.refresh"; 
    IHandlerService handlerService = PlatformUI.getWorkbench().getService(IHandlerService.class); 

    try { 
     handlerService.executeCommand(COMMAND_ID,null); 
    } catch (ExecutionException ex) { 
     ex.printStackTrace(); 
    } catch (NotDefinedException ex) { 
     ex.printStackTrace(); 
    } catch (NotEnabledException ex) { 
     ex.printStackTrace(); 
    } catch (NotHandledException ex) { 
     ex.printStackTrace(); 
    } 
} 

回答

1

您可以使用IResource#refreshLocal(),其中有(几乎)相同的效果。以下是针对单个文件的示例,但你可以以同样的方式做一个项目:

IResource dfile = ResourcesPlugin.getWorkspace().getRoot().getFile(path); 
dfile.create(blahblahblah, true, new NullProgressMonitor()); // obviously you don't need this, it's just an example 
dfile.refreshLocal(IResource.DEPTH_ZERO, null); 

更多信息请参见FAQ When should I use refreshLocal?

+0

有没有办法让所有当前打开的文件的路径? – 2012-07-20 12:15:24

+0

@AbortCoreDumped http://stackoverflow.com/questions/8190554/finding-currently-open-files-in-eclipse-plugin – 2012-07-20 12:22:47

+0

谢谢。 refreshLocal不像我使用F5时那样重新加载文件。你知道F5和refreshLocal的效果有什么区别吗?我在想,如果一个人不能代替另一个人工作,或者在我的环境中是不同的东西,我是怎么称呼它的,等等。 – 2012-07-20 15:17:41

0

我只是用了类似的问题所困扰,只是想分享我这里的见解......

背景:我用GMF的编辑工作,并希望增加一些节点和边缘的编程。做到这一点的“正确”方法是添加一些create-node-and-element-command,这将创建模型元素和视图,但为了快速构建解决方案原型,我只是添加了模型元素并让GMF找出它自己的节点。这对节点运行良好,但需要用F5刷新编辑器的边缘。

我看着plugin.xml搜索F5键合。然而,调用该命令并不起作用,因为它会检查选择内容,显然当执行我的实际命令(创建元素的命令)时,选择是null。然而,是什么命令实际上做的检查后,工作对我来说(刷新图,揭示了新创建的元素的所有节点和边缘):

EObject modelElement = ((View) ((EditPart) structuredSelection 
     .getFirstElement()).getModel()).getElement(); 
List editPolicies = CanonicalEditPolicy 
     .getRegisteredEditPolicies(modelElement); 
for (Iterator it = editPolicies.iterator(); it.hasNext();) { 
    CanonicalEditPolicy nextEditPolicy = (CanonicalEditPolicy) it.next(); 
    nextEditPolicy.refresh(); 
} 

或更短:

CanonicalEditPolicy.getRegisteredEditPolicies(modelElement) 
     .forEach(CanonicalEditPolicy::refresh); 

也就是说,假设(a)你有一个GMF编辑器,并且(b)你可以访问模型元素和/或编辑部分,最好是图表本身。你可以得到这样的:

PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();