2017-03-11 8 views
-1

Eclipseエディタでアクティブなページを取得する必要があります。どのように私はこの問題を解決することができますeclipseプラグインでアクティブなページを取得するにはどうすればよいですか?

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) 

:?私はこのコードを使用する場合

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

しかし、それは次のようなエラーメッセージを生成します。私はそれをGoogleで検索すると、私は以下のコードが見つかりましたか

追加 これは私の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を実装するように修正しようとしました。これは修正されたものです。あなたのコードがスレッドで実行されているためです

IWorkbenchWindow win = wb.getActiveWorkbenchWindow(); 

@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(); 
     } 
     } 
    } 
    });  
} 

はしかし、あなたがからアクティブなワークベンチ・ウィンドウにnullを取得している1が...

+1

コードスニペットは、現在アクティブなエディタを取得するための正しいコードです。ポストされたスタックトレースはスニペットには関係しません。 'wb = PlatformUI.getWorkbench();'にブレークポイントを設定し、コードをデバッグする。 –

+0

このエラーは、私がwin.getActivePage()を実行したときに発生します。 – user3649231

答えて

2

を働いていませんでした修正しましたこれはメインのUIスレッドではありません。getActiveWorkbenchWindowはこの場合nullを返します。

このようなUI操作を使用するには、おそらくDisplay.asyncExecを使用して、コードをUIスレッドで実行する必要があります。何かのように:(古いJavaの使用Runnableために、Javaの8ラムダを使用して)

public void elementChanged(ElementChangedEvent event) { 

    ... code not run in UI thread 

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

+0

このコードは、createPartControl()の最後で使用されます。いつ私はそれを使うべきですか? – user3649231

+1

あなたが表示するスタックトレースは、 'elementChanged'メソッド(おそらく' IElementChangedListener'リスナー)を持つ匿名クラスで動作するコード用です。コードが別のスレッドで実行されています。そのコードを変更する必要があります。 –

+0

ありがとうございました。私はそれを試みます。 – user3649231

関連する問題