2010-05-12 21 views
8

Nous voulons rapidement prototyper des widgets en Java. Nous les superposons sur un écran écrit dans un package graphique tiers propriétaire. Nous constatons que l'interface graphique Java détourne le focus du clavier du gestionnaire de fenêtres. Le gestionnaire de fenêtres est fvwm, j'ai essayé de le configurer afin que l'application Java ne soit pas mise au point, et de plus si elle obtient le focus pour l'enlever et la donner à l'autre GUI. Si je lance cette application avec l'application Java, cela ne fonctionne pas (à chaque fois que la souris est sur l'interface graphique Java) - si j'échange un widget graphique X standard (XEyes) à la place de l'interface graphique Java fonctionne comme un charme. Cela donne une certaine crédibilité à la revendication (maintenue par les gens de fvwm) que Java ne respecte pas l'ICCCM.Comment arrêter/contourner les applications Java en dérobant le focus dans les gestionnaires de fenêtres Linux

Je me demande si d'autres personnes ont résolu ce problème et si oui comment. Jusqu'à présent, j'ai quelques choix pour essayer de résoudre ce problème:

1) twink les paramètres Java, en espérant que si j'éteins le focus, il retournera peut-être le contrôle de focus au gestionnaire de fenêtres (jusqu'ici j'ai try "setFocusable (false)" sur le parent JFrame Cela n'a pas fonctionné Un thread "http://java.sun.com/javase/6/webnotes/trouble/TSG-Desktop/html/awt.html#gdaao" a indiqué que je devrais plutôt faire "Window.setFocusableWindowState (false)" L'interface graphique en question n'a pas encore été refaite dans une fenêtre mais Je ne suis pas non plus complètement convaincu que Java va relâcher l'attention

2) de faire des appels de bas niveau X dans le programme Java en utilisant JNI. Je pense que cela fonctionnerait probablement, mais, je n'ai jamais beaucoup joué avec le bas niveau X. Je ne sais pas quels appels je devrais utiliser (XtSetKeyboardFocus() est censé être dangereux à appeler ...) ou comment je peux identifier l'interface graphique sur laquelle je travaille (à cet égard, fvwm était sympa car ils avaient une interface graphique qui vous permettait de cliquer sur une autre interface et de trouver son "nom" et sa "classe")

3) utiliser un "plus fort" gestionnaire de fenêtres Certains gestionnaires de fenêtres qui n'utilisent pas ICCCM pourraient mieux gérer Java. Bien sûr, il y a une pléthore de gestionnaires, et je ne sais pas sur quoi se concentrer. De même, nombre d'entre eux semblent manquer de précision en ce qui concerne la mise au point par application (la plupart ne semblent s'intéresser qu'aux politiques générales).

Répondre

5

Enfin, le prototype a été retravaillé dans un JWindow plutôt que dans un JFrame, et quand ce JWindow a été mis à "setFocusableWindowState" (faux), Java a remis le focus ... le problème a été résolu.