Bonjour,
Je vais essayer de faire le plus simple possible.
J'ai actuellement une interface graphique contenu dans une JFrame. On me demande d'intégrer cette interface graphique (donc la JFrame) dans une autre application tierce. Cela à moindre coût, c'est à dire sans avoir à refaire tout le code de l'interface graphique ou de passer par une autre techno (JApplet ou autre...). En sachant que cette application tierce n'est pas codé en java.
Pour imager le plus simplement possible (les applications citées n'ont rien à voir avec ce que je fais mais c'est juste pour imager la demande): mon interface graphique c'est Eclipse et je voudrais l'intégrer dans un onglet de Google Chrome. Je vais aussi retirer la barre de titre d'Eclipse pour lui retirer son close/minimize/maximize/bordures (et donc le redimensionnement) et profiter des possibilités de l'onglet chrome (titre, croix pour fermer l'onglet)

J'ai trouvé une solution en passant par les APIs Win32 et la fonction SetParent: je lui fournis le Handle de ma JFrame et le Handle du composant parent dans lequel je dois m'intégrer.
J'utilise du code obsolète pour récupérer le Handle de ma JFrame mais c'est pour l'instant le seul moyen que j'ai trouvé pour récupérer le Handle en java Swing.

Etape 1: retirer la barre de titre de ma JFrame (variable myjframe)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
myjframe.setUndecorated(true);
myjframe.getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
myjframe.setVisible(true);
Etape 2: récupérer le Handle de ma JFrame
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
Class my_class = Class.forName("sun.awt.windows.WComponentPeer");
Method method = my_class.getMethod("getHWnd", null);
 
Object myobj = my_class.cast(myjframe.getPeer());			
long myhandle = (long)method.invoke(myobj);
Avec cela, je peux appeler la fonction User32 SetParent
J'ai aussi suivi les consignes de la fonction SetParent: j'ai modifié le style de ma JFrame (toujours via les APIs Win32) en retirant le style WS_POPUP et en ajoutant WS_CHILD .

Résultat: ça marche plutôt bien en apparence.
En apparence car j'ai de gros problème sur la gestion du focus. Mais je suis incapable de dire d'où ça vient.
Exemple le plus flagrant: dans mon interface java SWING j'ai un JMenuBar. Quand j'affiche le menu java et si je clique en dehors de la fenêtre java (que ce soit dans l'application tierce ou n'importe quelle autre application), le menu ne disparaît pas. Il reste devant tant que je ne clique pas ailleurs dans mon appli java. J'ai d'autres exemples mais je ne vais pas tous les détailler (molette de souris qui ne fonctionne pas tout le temps quand je veux scroller un JTree)

Je sais que je suis sur le forum dédié à AWT/Swing donc je vous demanderai rien par rapport à l'utilisation même des API Win32. Par contre je suis en panne sèche d'idée: donc je voudrais discuter de la viabilité de ma solution par rapport au comportement natif java et sa gestion du focus (ou autres aspects que je n'aurais pas pris en compte: dispatch des événements souris...).

J'ai lu sur internet que le java swing ne faisait pas grand chose sur la barre de titre comme c'est géré par l'OS. Et il est vrai que le fait que je fasse une Undecorated JFrame n'est pas un problème: j'ai testé ma JFrame sans faire le setParent et je n'ai pas de souci. L'interface réagit bien (menu, focus, molette de la souris sur le JTree...). Donc j'ai écarté le facteur 'undecorated JFrame' de l'équation.

Par contre j'ai lu (je ne sais plus où) que le composant parent devait gérer un processMouseEvent (que j'ai retrouvé sur la classe JComponent). Est-ce que ça peut venir de là? Est-ce qu'en changeant de "fenêtre parent" j'aurais pu casser la transmission des événements souris et autre? Est-ce que comme le parent n'est plus le desktop windows, windows ne me transmettrait plus les notifications car c'est censé être géré par la nouvelle fenêtre parente (auquel cas je ne suis plus sur un problème java mais un problème à résoudre sur mon application tierce)

Désolé si ma demande n'est pas très clair.
Et merci pour vos retours.