如何在 Eclipse 插件中获取活动页面?

use*_*231 1 java eclipse eclipse-plugin

我需要在 Eclipse 编辑器中获取活动页面。当我用谷歌搜索时,我发现了下面的代码\xe2\x80\x8b:

\n\n
IWorkbench wb = PlatformUI.getWorkbench();\nIWorkbenchWindow win = wb.getActiveWorkbenchWindow();\nIWorkbenchPage page = win.getActivePage();\nITextEditor editor = (ITextEditor) page.getActiveEditor();\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,当我使用此代码时,它会生成以下错误消息:

\n\n
java.lang.NullPointerException\n    at kr.ac.jbnu.ssel.instantfeedback.views.InstantFeedbackView$1.elementChanged(InstantFeedbackView.java:136)\n    at org.eclipse.jdt.internal.core.DeltaProcessor$3.run(DeltaProcessor.java:1662)\n    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)\n    at org.eclipse.jdt.internal.core.DeltaProcessor.notifyListeners(DeltaProcessor.java:1652)\n    at org.eclipse.jdt.internal.core.DeltaProcessor.fireReconcileDelta(DeltaProcessor.java:1504)\n    at org.eclipse.jdt.internal.core.DeltaProcessor.fire(DeltaProcessor.java:1463)\n    at org.eclipse.jdt.internal.core.JavaModelOperation.run(JavaModelOperation.java:765)\n    at org.eclipse.jdt.internal.core.JavaModelOperation.runOperation(JavaModelOperation.java:790)\n    at org.eclipse.jdt.internal.core.CompilationUnit.reconcile(CompilationUnit.java:1250)\n    at org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy.reconcile(JavaReconcilingStrategy.java:128)\n    at org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy.access$0(JavaReconcilingStrategy.java:110)\n    at org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy$1.run(JavaReconcilingStrategy.java:90)\n    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)\n    at org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy.reconcile(JavaReconcilingStrategy.java:87)\n    at org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy.reconcile(JavaReconcilingStrategy.java:154)\n    at org.eclipse.jdt.internal.ui.text.CompositeReconcilingStrategy.reconcile(CompositeReconcilingStrategy.java:89)\n    at org.eclipse.jdt.internal.ui.text.JavaCompositeReconcilingStrategy.reconcile(JavaCompositeReconcilingStrategy.java:104)\n    at org.eclipse.jface.text.reconciler.MonoReconciler.process(MonoReconciler.java:73)\n    at org.eclipse.jface.text.reconciler.AbstractReconciler$BackgroundThread.run(AbstractReconciler.java:207)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我该如何解决这个问题?

\n\n

添加\n这是我的 elementChanged() 函数。它在方法中。

\n\n
private void addListenerToCheckChange_save() {\n  JavaCore.addElementChangedListener(new IElementChangedListener() {\n\n    @Override\n    public void elementChanged(ElementChangedEvent event) {\n      IWorkbench wb = PlatformUI.getWorkbench();\n      IWorkbenchWindow win = wb.getActiveWorkbenchWindow();\n      IWorkbenchPage page = win.getActivePage();\n      ITextEditor editor = (ITextEditor) page.getActiveEditor();\n      IJavaElement javaElement = JavaUI.getEditorInputJavaElement(editor.getEditorInput());\n      if (javaElement instanceof ICompilationUnit) {\n        ITextSelection sel = (ITextSelection) editor.getSelectionProvider().getSelection();\n        IJavaElement selected = null;\n        try {\n          ...\n        } catch (JavaModelException JME) {\n          JME.printStackTrace();\n        }\n      }\n    }\n  });\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我尝试修改它以在我的视图类中实现 IElementChangedListener 。这是修改过的一种。

\n\n
@Override\npublic void elementChanged(ElementChangedEvent arg0) {\n  Display.getCurrent().asyncExec(new Runnable() {\n\n    @Override\n    public void run() {\n      IWorkbench wb = PlatformUI.getWorkbench();\n      IWorkbenchWindow win = wb.getActiveWorkbenchWindow();\n      IWorkbenchPage page = win.getActivePage();\n      ITextEditor editor = (ITextEditor) page.getActiveEditor();\n      IJavaElement javaElement = JavaUI.getEditorInputJavaElement(editor.getEditorInput());\n      if (javaElement instanceof ICompilationUnit) {\n        ITextSelection sel = (ITextSelection) editor.getSelectionProvider().getSelection();\n        IJavaElement selected = null;\n        try {\n          ...\n        } catch (JavaModelException JME) {\n          JME.printStackTrace();\n        }\n      }\n    }\n  });       \n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

然而修改后却不起作用...

\n

gre*_*449 5

您从以下位置获取活动工作台窗口的 null 值:

IWorkbenchWindow win = wb.getActiveWorkbenchWindow();
Run Code Online (Sandbox Code Playgroud)

这是因为您的代码正在一个不是主 UI 线程的线程中运行 -getActiveWorkbenchWindow在这种情况下返回 null。

要使用这样的 UI 操作,您需要安排在 UI 线程中运行代码,也许可以使用Display.asyncExec. 就像是:

IWorkbenchWindow win = wb.getActiveWorkbenchWindow();
Run Code Online (Sandbox Code Playgroud)

(使用 Java 8 lambda,对于较旧的 Java,请使用Runnable)。