2017-09-25 2 views
1

J'ai une application C++ X/Motif pour laquelle de nouvelles fenêtres ont été ajoutées en utilisant Java/JNI.Faire de la boîte de dialogue JVM une fenêtre enfant de fenêtre de niveau supérieur natif

Les nouvelles fenêtres Java ont été des fenêtres de niveau supérieur ou des boîtes de dialogue sans parent.

Y a-t-il un moyen raisonnable d'obtenir une fenêtre enfant créée par la JVM, comme un JDialog, pour avoir comme parent une fenêtre créée sur le côté natif en utilisant X/Motif, et si oui alors comment? Cela serait toujours utile même si Java AWT/Swing n'est pas conscient de la structure parentale et que le gestionnaire de fenêtres garde juste la boîte de dialogue au dessus de la fenêtre de haut niveau (bien sûr, avoir tout le contrôle normal sur Windows serait préférable , juste pas strictement nécessaire pour toutes les utilisations de ma question).

Je pense que la réponse pourrait être "Non, pas de manière raisonnable, vous auriez à faire une chirurgie épique à la fois sur votre côté natal et au sein de la JVM." Si c'est la réponse, alors qu'il en soit ainsi. Mais j'espère que quelqu'un aura une réponse du genre "Si vous faites cet appel X ou cet appel de gestionnaire de fenêtres, vous pouvez demander au gestionnaire de fenêtres de fournir certaines propriétés de dialogue avec la fenêtre de premier niveau comme parent." Essentiellement, je cherche à augmenter l'intégration entre les interfaces utilisateur C++ et Java autant que possible. À l'heure actuelle, ils sont exécutés en tant qu'application à l'aide de JNI, mais les fenêtres/composants de l'interface graphique sont essentiellement séparés, malgré le partage des données. Un avantage de ceci, déjà mentionné, est que les boîtes de dialogue n'apparaissent pas derrière ce que l'utilisateur perçoit comme la fenêtre de niveau supérieur. Une autre chose que j'ai envisagée, bien que je ne le ferai probablement pas (dites-moi à quel point c'est fou), est de faire croire que les composants Java sont dans la fenêtre C++ en obtenant les coordonnées d'un composant sur le côté C++, affichant une fenêtre sans bordure sur le côté Java à cet emplacement de l'écran, de sorte qu'il semble que cela fait partie de l'application C++. Je peux penser à tant d'effets secondaires négatifs, cependant, que je ne le ferais pas à moins qu'il y ait un moyen simple de les annuler (problèmes de focus, une fenêtre affichant entre cette fenêtre fictive et la vraie fenêtre de haut niveau, et d'autres choses affecterait l'expérience de l'utilisateur). Même en évitant cela, cependant, il y a toujours des avantages à une réponse affirmative à ma question.

+0

Quelle version de _Java_ ciblez-vous? Et quel toolkit _AWT_ utilisez-vous - est-ce le "MToolkit" ou le "XToolkit"? Fondamentalement ce que vous voulez réaliser sonne comme une implémentation personnalisée de _AWT Toolkit_ (vous pouvez prendre 'XToolkit' de _OpenJDK_ et l'adapter à vos besoins). – Bass

Répondre

0

Si vous utilisez le XToolkit (Java 1.7+), vous pouvez procéder comme suit:

  1. obtenir l'ID numérique du pair natif d'une instance java.awt.Window (voir this answer).
  2. Recherchez la structure X11 Window correspondante par son ID en itérant les clients du serveur X (voir les sources des utilitaires xwininfo et xlsclients, également Select_Window_Args(int*, char**)).
  3. Utilisez XReparentWindow().