OSGI + SWT:如何将视图(GUI)拆分为多个包

发布于 2024-08-12 22:58:25 字数 277 浏览 3 评论 0原文

我正在使用 java、swt 和 osgi 编写一个图形应用程序。包 A 包含应用程序主窗口。根据用户的选择,必须加载不同的用户界面。也就是说,不同的 GUI 位于不同的捆绑包中。 因此主bundle A调用bundle B来绘制新的图形界面。包 B 包含许多类,以及扩展 Composite 类的 SWT 控件。该控件需要一个父控件来绘制。这里的问题是,bundle B 需要在bundle A 上绘制。我尝试将保存新界面的父组合从 A 发送到 B,但是当 B 创建新控件时,它崩溃了。

有什么想法吗?如何解决这个问题呢?

I'm writing a graphic application, with java, swt and osgi. The bundle A holds the application main window. Depending on the selection of the user, a different user interface must be loaded. That is, the different GUI are in different bundles.
So the main bundle A calls the bundle B to draw the new graphic interface. The bundle B contains many classes, SWT controls that extend the Composite class. This controls need a parent to draw to. The problem here is, the bundle B needs to draw on the bundle A. I tried to sends the parent composite that will hold the new interface from A to B, but when B creates the new control, it crashes.

Any idea? How to solve this problem?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

初雪 2024-08-19 22:58:25

听起来您正在尝试设置一些复杂的交叉依赖项,但效果不太好。

您了解白板模式吗?您可以在这里阅读更多内容:
http://www.osgi.org/wiki/uploads/Links/whiteboard。因此

,根据该模式,假设 A 是加载主 UI 的“主”包。为了简单起见,假设捆绑包 A 还导出以下接口:

public interface UIExtensionService {

    Control createExtension(Composite parent);

}

捆绑包 B(以及 C、D、E、F 等)然后注册该接口的适当实现。例如,如果您想根据给定的用户输入显示特定的内容,您可以在注册服务时使用属性来帮助您的主包缩小特定实现的范围。

然后,Bundle A 使用 BundleContext 查找 UIExtensionService 的适当实现,并调用传递您要使用的父级的 createExtension 方法。

希望有帮助。

Sounds like you're trying to setup some complicated cross dependency thing that isn't working out too well.

Are you aware of the Whiteboard pattern? You can read more here:
http://www.osgi.org/wiki/uploads/Links/whiteboard.pdf

So based on that pattern let's say A is your 'main' bundle which loads the main UI. To keep things simple, let's say bundle A also exports the following interface:

public interface UIExtensionService {

    Control createExtension(Composite parent);

}

Bundle B (and C, D, E, F, etc) then registers appropriate implementations of this interface. You can use properties when you register the service to help your main bundle narrow down on a particular implementation for instance, if you want to show something specific based on a given user input.

Bundle A then uses the BundleContext to find an appropriate implementation of UIExtensionService and calls the createExtension method passing in the parent you want to use.

Hope that helps.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文