use*_*231 1 java eclipse eclipse-plugin
我需要在 Eclipse 编辑器中获取活动页面。当我用谷歌搜索时,我发现了下面的代码\xe2\x80\x8b:
\n\nIWorkbench wb = PlatformUI.getWorkbench();\nIWorkbenchWindow win = wb.getActiveWorkbenchWindow();\nIWorkbenchPage page = win.getActivePage();\nITextEditor editor = (ITextEditor) page.getActiveEditor();\nRun Code Online (Sandbox Code Playgroud)\n\n但是,当我使用此代码时,它会生成以下错误消息:
\n\njava.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)\nRun Code Online (Sandbox Code Playgroud)\n\n我该如何解决这个问题?
\n\n添加\n这是我的 elementChanged() 函数。它在方法中。
\n\nprivate 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}\nRun 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}\nRun Code Online (Sandbox Code Playgroud)\n\n然而修改后却不起作用...
\n您从以下位置获取活动工作台窗口的 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)。
| 归档时间: |
|
| 查看次数: |
1026 次 |
| 最近记录: |