2009-12-03 4 views
1

J'écris une application graphique, avec java, swt et osgi. Le bundle A contient la fenêtre principale de l'application. Selon la sélection de l'utilisateur, une interface utilisateur différente doit être chargée. Autrement dit, les différentes interfaces graphiques sont regroupées dans différents bundles. Ainsi, le bundle principal A appelle le bundle B pour dessiner la nouvelle interface graphique. Le bundle B contient plusieurs classes, les contrôles SWT qui étendent la classe Composite. Ces contrôles ont besoin d'un parent pour dessiner. Le problème ici est que le bundle B doit dessiner sur le bundle A. J'ai essayé d'envoyer le composite parent qui contiendra la nouvelle interface de A à B, mais lorsque B crée le nouveau contrôle, il se bloque.OSGI + SWT: Comment diviser la vue (GUI) en plusieurs paquets

Une idée? Comment résoudre ce problème?

+0

Pourriez-vous fournir plus d'informations sur le "crash"? Par exemple. une trace de pile d'exception? Ce peut être un problème avec les exportations et les importations de paquets dans vos fichiers OSGi MANIFEST. –

Répondre

1

On dirait que vous essayez d'installer une chose complexe de dépendance croisée qui ne marche pas trop bien.

Connaissez-vous le modèle Tableau blanc? Vous pouvez en lire plus ici: http://www.osgi.org/wiki/uploads/Links/whiteboard.pdf

Donc, sur la base de ce modèle, disons que A est votre bundle 'principal' qui charge l'interface principale. Pour garder les choses simples, disons bundle exporte également l'interface suivante:

public interface UIExtensionService { 

    Control createExtension(Composite parent); 

} 

Bundle B (et C, D, E, F, etc.) enregistre alors les mises en œuvre appropriées de cette interface. Vous pouvez utiliser des propriétés lorsque vous enregistrez le service pour aider votre regroupement principal à se restreindre à une implémentation particulière, par exemple, si vous souhaitez afficher quelque chose de spécifique en fonction d'une entrée utilisateur donnée. Bundle A utilise ensuite BundleContext pour trouver une implémentation appropriée de UIExtensionService et appelle la méthode createExtension passant dans le parent que vous souhaitez utiliser.

Espérons que ça aide.

Questions connexes