2016-04-13 16 views
0


私は2つのプラグインを使用しています:AとBと呼んでみましょう。
アプリケーションを起動すると、AはBを起動し、現在のActiveEditorというパラメータを与えます。 Bは、現在のエディタでいくつかのアクションを実行できるようになりました。この点はすべてが問題ありません。
しかし、このパラメータはAがインスタンス化された場合にのみ与えられます。したがって、現在のエディタが変更された場合、Bは変更を認識しません。
私はアクティブなエディタに2秒ごとに取得し、B. 問題にそれを設定し、Aによって開始されたスレッドを、使用しようとしました:=>Java:スレッド内でアクティブなエディタを取得する方法は?

java.lang.NullPointerException: while trying to invoke the method org.eclipse.ui.IWorkbenchWindow.getActivePage() of a null object returned from org.eclipse.ui.IWorkbench.getActiveWorkbenchWindow() 
at com.highdeal.tests.cortex.eclipse.RefreshThread.run(RefreshThread.java:14) 

たびは、ここで開始したスレッドのコードがある場合NullPointerExceptionプラグインA:

public class RefreshThread extends Thread { 

public void run(){ 
    while (true){ 
     try{ 
      Thread.sleep(1000); 
      IEditorPart iep = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor(); 
      new SampleAction(iep); 
     } catch (Exception e){ 
      e.printStackTrace(); 
     } 

    } 
} 

}

私はプラグインAのコンストラクタに次のコードを移行する場合、それは正常に動作します:

IEditorPart iep = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor(); 
new SampleAction(iep); 

お読みいただきありがとうございます。詳しい説明が必要な場合は私に相談してください。

+0

SampleActionはプラグインBですか? BTWこのコードサンプルは、ソリューションに到達するには十分ではありませんが、これは非常に悪い方法であると言って私を止めることはありません。この場合、Observerパターンを調べる必要があります。 – Madhusudhan

+0

あなたは正しいです、私のプラグインのSampleAction B. Observer Patternに関する情報をありがとう、私は見ていきます。幸いにも、与えられた答えの1つが私を解決に導いた。 – MedAl

答えて

1

PlatformUI.getWorkbench().getActiveWorkbenchWindow()は、バックグラウンドスレッド(つまりUIスレッドではないスレッド)から呼び出されたときは常にnullを返します。

これを行うより良い方法は、IPartListenerを使用して変更されているアクティブな部分をリスンすることです。

IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); 

window.getPartService().addPartListener(part listener); 

(UIスレッドで実行する必要があります)。

パーツリスナーには、各パーツがアクティブになっていることが伝えられ、これが新しいエディタであるかどうかを確認できます。

+0

これは現在機能しています。ありがとうございます。 – MedAl

1

UIThreadの代わりに他のスレッドでUIコードを実行するには、UIThreadSynchronizerまたはDisplay.syncExec()\ asyncExec()呼び出しを使用します。

+0

残念ながら、このコードは無限ループのように見えます。おそらく、プラグインが動作するためには、プラグインがどのように通信しているかを再検討する必要があります – MedAl

関連する問題