我正在编写一个图形应用程序,包含java,swt和osgi。捆绑包A保存应用程序主窗口。根据用户的选择,必须加载不同的用户界面。也就是说,不同的GUI在不同的包中。 因此主捆绑包A调用捆绑包B来绘制新的图形界面。 bundle B包含许多类,扩展Composite类的SWT控件。此控件需要父级绘制。这里的问题是,bundle B需要在bundle A上绘制。我试图发送将新接口从A保存到B的父组合,但是当B创建新控件时,它会崩溃。
有什么想法吗?如何解决这个问题?
答案 0 :(得分:1)
听起来你正试图设置一些复杂的交叉依赖项,但效果不佳。
您是否了解白板图案?你可以在这里阅读更多: http://www.osgi.org/wiki/uploads/Links/whiteboard.pdf
因此,基于该模式,假设A是您加载主UI的“主”包。为了简单起见,我们假设bundle A还导出了以下接口:
public interface UIExtensionService {
Control createExtension(Composite parent);
}
Bundle B(以及C,D,E,F等)然后注册该接口的适当实现。例如,如果要根据给定的用户输入显示特定内容,可以在注册服务时使用属性来帮助主捆绑包缩小特定实现。
Bundle A然后使用BundleContext查找UIExtensionService的适当实现,并调用传递要使用的父项的createExtension方法。
希望有所帮助。