从上下文菜单任务打开CytoPanelComponent实现类JPanel遇服务获取问题
解决Cytoscape服务获取失败的问题
问题根源
你注册服务时是按CytoPanelComponent.class类型注册的,但获取时用了MyPanel.class——Cytoscape服务注册中心是按注册时声明的类型索引服务的,所以直接用实现类类型查找会找不到。
具体解决方法
方法1:通过接口类型获取后强转
直接用注册时的接口类型获取服务,再转换为你的自定义面板类:
// 在任务的run方法中 CytoPanelComponent panelService = registrar.getService(CytoPanelComponent.class); if (panelService instanceof MyPanel) { MyPanel myPanel = (MyPanel) panelService; // 执行你的面板操作 }
方法2:用属性区分多服务场景
如果你的插件中存在多个CytoPanelComponent实现类,注册时可以添加自定义属性做标识:
// 注册服务时 Properties props = new Properties(); props.setProperty("custom.panel", "my-unique-panel-id"); registerService(context, myPanel, CytoPanelComponent.class, props);
获取时通过服务过滤器匹配属性:
// 在任务的run方法中 ServiceFilter<CytoPanelComponent> filter = service -> "my-unique-panel-id".equals(service.getProperty("custom.panel")); CytoPanelComponent panelService = registrar.getService(CytoPanelComponent.class, filter); if (panelService instanceof MyPanel) { MyPanel myPanel = (MyPanel) panelService; }
方法3:同时注册实现类类型(可选)
如果确实需要直接用MyPanel.class获取服务,可以注册服务时同时声明两个类型:
registerService(context, myPanel, CytoPanelComponent.class, new Properties()); registerService(context, myPanel, MyPanel.class, new Properties());
这样后续就能直接调用registrar.getService(MyPanel.class)获取,但注意如果有多个MyPanel实例,仍需配合属性过滤避免混淆。
内容的提问来源于stack exchange,提问作者Mike Gingell
相关产品推荐
相关产品推荐

