【问题标题】:How can I get active page in eclipse plugin?如何在 eclipse 插件中获取活动页面?
【发布时间】:2017-03-11 09:50:05
【问题描述】:

我需要在 Eclipse 编辑器中获取活动页面。当我搜索它时,我发现了以下代码:

IWorkbench wb = PlatformUI.getWorkbench();
IWorkbenchWindow win = wb.getActiveWorkbenchWindow();
IWorkbenchPage page = win.getActivePage();
ITextEditor editor = (ITextEditor) page.getActiveEditor();

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

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

我该如何解决这个问题?

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

private void addListenerToCheckChange_save() {
  JavaCore.addElementChangedListener(new IElementChangedListener() {

    @Override
    public void elementChanged(ElementChangedEvent event) {
      IWorkbench wb = PlatformUI.getWorkbench();
      IWorkbenchWindow win = wb.getActiveWorkbenchWindow();
      IWorkbenchPage page = win.getActivePage();
      ITextEditor editor = (ITextEditor) page.getActiveEditor();
      IJavaElement javaElement = JavaUI.getEditorInputJavaElement(editor.getEditorInput());
      if (javaElement instanceof ICompilationUnit) {
        ITextSelection sel = (ITextSelection) editor.getSelectionProvider().getSelection();
        IJavaElement selected = null;
        try {
          ...
        } catch (JavaModelException JME) {
          JME.printStackTrace();
        }
      }
    }
  });
}

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

@Override
public void elementChanged(ElementChangedEvent arg0) {
  Display.getCurrent().asyncExec(new Runnable() {

    @Override
    public void run() {
      IWorkbench wb = PlatformUI.getWorkbench();
      IWorkbenchWindow win = wb.getActiveWorkbenchWindow();
      IWorkbenchPage page = win.getActivePage();
      ITextEditor editor = (ITextEditor) page.getActiveEditor();
      IJavaElement javaElement = JavaUI.getEditorInputJavaElement(editor.getEditorInput());
      if (javaElement instanceof ICompilationUnit) {
        ITextSelection sel = (ITextSelection) editor.getSelectionProvider().getSelection();
        IJavaElement selected = null;
        try {
          ...
        } catch (JavaModelException JME) {
          JME.printStackTrace();
        }
      }
    }
  });       
}

但是,修改后的一个不起作用...

【问题讨论】:

  • 代码sn -p 是获取当前活动编辑器的正确方法。发布的堆栈跟踪与 sn-p 无关。在wb = PlatformUI.getWorkbench(); 上设置断点并调试单步调试代码。
  • 这个错误发生在我执行 win.getActivePage() 时。

标签: java eclipse eclipse-plugin


【解决方案1】:

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

IWorkbenchWindow win = wb.getActiveWorkbenchWindow();

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

要使用这样的 UI 操作,您需要安排在 UI 线程中运行您的代码,可能使用Display.asyncExec。比如:

public void elementChanged(ElementChangedEvent event) {

   ... code not run in UI thread

   Display.getDefault().asyncExec(() ->
     {
       ... code to run in UI thread
     });
}

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

【讨论】:

  • 此代码用于 createPartControl() 的末尾。我应该什么时候使用它?
  • 您显示的堆栈跟踪是针对在具有elementChanged 方法(可能是IElementChangedListener 侦听器)的匿名类中运行的代码。那里的代码在不同的线程中运行。您必须更改该代码。
  • 非常感谢。我会试试的。
  • 嗯....我尝试在 createPartControl(Composite parent) 中作为 parent.getDisplay.asyncExec() 运行它。但是,之后的某个时候,会发生同样的错误。错了吗?
  • 您必须在 elementChanged 方法中运行 asyncExec - 请参见示例。
猜你喜欢
  • 2012-04-07
  • 1970-01-01
  • 2012-03-10
  • 2020-08-05
  • 1970-01-01
  • 2015-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多