2010-05-12 7 views
8

Queremos crear prototipos rápidamente de widgets en Java. Los superponemos sobre una pantalla escrita en un paquete de gráficos de terceros de propiedad. Encontramos que la GUI de Java le quita el foco del teclado al administrador de ventanas.Cómo detengo/soluciono las aplicaciones Java robando el foco en los administradores de ventanas de Linux

El administrador de ventanas es fvwm, he intentado configurarlo para que la aplicación Java esté configurada para no enfocar y, además, si alguna vez obtiene el foco para quitárselo y dárselo a la otra GUI.

Si ejecuto esto con la aplicación Java no funciona (siempre que el mouse esté sobre la GUI Java tiene el foco del teclado) - si cambio algún widget X GUI estándar (XEyes) en lugar de la GUI de Java, Funciona de maravilla. Esto presta cierta credibilidad a la afirmación (mantenida por las personas en fvwm) de que Java no respeta el ICCCM.

Me pregunto si otras personas han resuelto este problema y si es así cómo. Hasta ahora tengo algunas opciones para tratar de arreglar esto:

1) twiddle Java settings, esperando que si apago el foco quizás devuelva el control de foco al administrador de ventanas (hasta ahora he intenté con "setFocusable (false)" en el JFrame padre. Esto no funcionó. Un hilo "http://java.sun.com/javase/6/webnotes/trouble/TSG-Desktop/html/awt.html#gdaao" indicó que debería hacer "Window.setFocusableWindowState (false)" La GUI en cuestión no se ha vuelto a hacer en una ventana pero Tampoco estoy completamente convencido de que Java renueve el foco

2) realice llamadas X de bajo nivel en el programa Java utilizando JNI. Creo que esto probablemente funcionaría, pero nunca jugué mucho con el nivel bajo X. No estoy seguro de qué llamadas debería usar (se supone que XtSetKeyboardFocus() es peligroso llamar ...) o cómo puedo identificarme la interfaz gráfica de usuario en la que estoy operando (a este respecto fvwm estuvo bien ya que tenían una GUI que permitía hacer clic en otra GUI y averiguar su "nombre" y "clase")

3) utilizar un "más fuerte" administrador de ventanas Algunos administradores de ventanas que no usan ICCCM podrían tratar mejor con Java. Por supuesto, hay una plétora de gerentes, y no estoy seguro en qué concentrarme. Del mismo modo, muchos parecen ser cortos en especificar el enfoque por aplicación (a la mayoría parece importarles las políticas generales).

Respuesta

5

Finalmente, el prototipo se volvió a trabajar en una JWindow en lugar de un JFrame, y cuando ese JWindow había llamado aFocusableWindowState (falso) lo invocó, Java devolvió el enfoque ... problema resuelto.

Cuestiones relacionadas