加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – Eclipse RCP – 在创建View后立即添加一个Listener

发布时间:2020-12-15 04:15:20 所属栏目:Java 来源:网络整理
导读:问候Stackoverflowians, 我正在开发Eclipse RCP应用程序,并且必须在创建后立即将SelectionListener添加到Project Explorer视图. 我已经意识到我不能在我的贡献插件的Activator中执行此操作,而为了通过PlatformUI.getWorkbench()获取SelectionService.getActi
问候Stackoverflowians,

我正在开发Eclipse RCP应用程序,并且必须在创建后立即将SelectionListener添加到Project Explorer视图.

我已经意识到我不能在我的贡献插件的Activator中执行此操作,而为了通过PlatformUI.getWorkbench()获取SelectionService.getActiveWorkbenchWindow().getSelectionService()我必须有一个活动的工作台窗口(这是调用Activator start()时返回null

所以我的问题:
我什么时候可以获得SelectionService,以便创建Project Explorer视图并且可见,但是用户还没有能够“按任何按钮”?

任何意见和建议表示赞赏!

解决方法

如果您真的想要从启动时跟踪用户选择而没有可以在创建时注册ISelectionListener的UI(如视图),那么您可以使用启动挂钩.

Eclipse提供了扩展点org.eclipse.ui.startup.它接受一个实现接口org.eclipse.ui.IStartup的类.它将在UI创建后调用,因此ISelectionService已经可用,然后:

public class StartupHook implements IStartup,ISelectionListener {

    @Override
    public void earlyStartup() {
        final IWorkbench workbench = PlatformUI.getWorkbench();
        workbench.addWindowListener(new IWindowListener() {

            @Override
            public void windowOpened(IWorkbenchWindow window) {
                addSelectionListener(window);
            }

            @Override
            public void windowClosed(IWorkbenchWindow window) {
                removeSelectionListener(window);
            }
            /* ... */
        });

        workbench.getDisplay().asyncExec(new Runnable() {
            public void run() {
                for (IWorkbenchWindow window : workbench.getWorkbenchWindows()) {
                    addSelectionListener(window);
                }
            }
        });
    }

    private void addSelectionListener(IWorkbenchWindow window) {
        if (window != null) {
            window.getSelectionService().addSelectionListener("org.eclipse.ui.navigator.ProjectExplorer",this);
        }
    }

    private void removeSelectionListener(IWorkbenchWindow window) {
        if (window != null) {
            window.getSelectionService().removeSelectionListener("org.eclipse.ui.navigator.ProjectExplorer",this);
        }
    }

    @Override
    public void selectionChanged(IWorkbenchPart part,ISelection selection) {
        // TODO handle selection changes
        System.out.println("selection changed");
    }
}

请注意0??7000因为它迫使OSGi很早就激活你的捆绑包(所以所有依赖捆绑包也是如此!)并减慢系统启动速度.所以请确保你的包很整齐.将捆绑依赖性降至最低.有时需要将启动钩子代码移动到一个单独的包中以实现这一点.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读