2010-05-12 7 views
8

Vogliamo creare rapidamente prototipi di widget in Java. Le sovrapponiamo sopra un display scritto in un pacchetto di grafica di terze parti proprietario. Scopriamo che la GUI Java ruba l'attenzione della tastiera lontano dal window manager.Come arrestare/risolvere le applicazioni Java che rubano l'attenzione ai gestori di finestre Linux

Il gestore di finestre è fvwm, ho provato a configurarlo in modo che l'app Java non sia messa a fuoco, e inoltre se ottiene sempre l'attenzione a portarlo via e darlo all'altra GUI.

Se eseguo questa operazione con l'app Java, non funziona (ogni volta che il mouse si trova sopra la GUI Java ha lo stato attivo della tastiera) - se si scambia qualche widget X GUI standard (XEyes) al posto della GUI Java, funziona come un fascino. Ciò conferisce una certa fede alla rivendicazione (mantenuta dalle persone di fvwm) che Java non rispetta l'ICCCM.

Mi chiedo se altre persone hanno risolto questo problema e se sì come. Finora ho alcune scelte su come provare a risolvere il problema:

1) twiddle Impostazioni Java, sperando che se spengo lo stato attivo, forse restituirà il controllo del focus al gestore di finestre (finora ho ha provato "setFocusable (false)" sulla JFrame principale.Questo non ha funzionato.Una discussione "http://java.sun.com/javase/6/webnotes/trouble/TSG-Desktop/html/awt.html#gdaao" indica che dovrei invece fare "Window.setFocusableWindowState (false)" La GUI in questione non è stata ancora rifatta in una finestra ma Non sono del tutto convinto che Java rilascerà il focus

2) effettuare chiamate X di basso livello nel programma Java utilizzando JNI. Penso che probabilmente funzionerebbe, ma non ho mai giocato molto con il basso livello X. Non sono sicuro di quali chiamate dovrei usare (XtSetKeyboardFocus() dovrebbe essere pericoloso chiamare ...) o come posso identificarmi la GUI su cui sto lavorando (in questo senso fvwm era bello dato che avevano una GUI che permetteva di cliccare su un'altra GUI e scoprire il suo "nome" e "classe")

3) usare un "più forte" gestore di finestre. Alcuni gestori di finestre che non utilizzano ICCCM potrebbero essere in grado di gestire meglio Java. Certo, ci sono una miriade di manager, e non sono sicuro su cosa concentrarmi. Allo stesso modo, molti sembrano non essere in grado di specificare la messa a fuoco in base all'app (la maggior parte sembra interessarsi solo delle politiche generali).

risposta

5

Infine il prototipo è stato rielaborato in una JWindow anziché in una JFrame, e quando JWindow aveva impostatoFocusableWindowState (false) ha richiamato Java ha restituito il focus al fuoco ... problema risolto.

Problemi correlati