Java:如何在线程中获取活动编辑器?

时间:2016-04-13 10:05:11

标签: java eclipse multithreading eclipse-plugin


我的问题是以下问题:我正在使用2个插件:让他们称他们为A和B. 当我启动应用程序时,A启动B并给他一个参数:当前的ActiveEditor。 B现在可以在当前编辑器上执行某些操作。在这一点上,一切都很好。
但是,仅在实例化A时才给出参数,因此如果当前编辑器发生更改,则B不会知道更改。
我试图使用一个由A启动的线程,每两秒获取一次活动编辑器并将其设置为B. 问题:每次都是NullPointerException =>

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)

以下是插件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);

感谢阅读。问我是否需要进一步解释。

2 个答案:

答案 0 :(得分:1)

当从后台线程(即不是UI线程的线程)调用它时,

PlatformUI.getWorkbench().getActiveWorkbenchWindow()总是返回null

更好的方法是使用IPartListener来监听正在更改的活动部分。

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

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

(必须在UI线程中运行)。

部件监听器将被告知每个部件被激活,您可以检查这是否是一个新的编辑器。

答案 1 :(得分:1)

要在其他线程而不是UIThread中运行UI代码,请使用UIThreadSynchronizer或Display.syncExec()\ asyncExec()调用。