2011-01-25 23 views
13

Estoy escribiendo una aplicación Java (Swing GUI) que periódicamente muestra un JFrame.¿Es posible llevar JFrame al frente pero NO enfocar?

¿Es posible de alguna manera llevar la ventana al frente (foo.setAlwaysOnTop (verdadero) sería aún mejor) pero sin teniendo el foco?

Algunas personas alejan sus ojos de la pantalla de vez en cuando para mirar el teclado mientras escriben, y estoy seguro de que si esta ventana capturara siempre el foco del teclado la gente se molestaría mucho ya que les está causando pierde bastantes teclas cada vez que aparece desapercibido.

En otros casos, incluso cuando el usuario es realmente capaz de escribir sin mirar el teclado todo el tiempo, que tiene una ventana pop-up y obtener enfoque podría causar acciones no deseadas de la ventana emergente en sí (algunos Tab + Enter combinación, por ejemplo, donde el usuario selecciona accidentalmente una opción que realmente no habría seleccionado de otra manera).

¡Gracias de antemano!

actualización

Como sugiere Jonas, foo.setFocusableWindowState(false); parece funcionar si se llama cuando la ventana se ha rendido (probado en Gnome solamente).

Esto no funciona:

foo.setFocusableWindowState(false); 
foo.setVisible(true); 
foo.setFocusableWindowState(true); 

Sin embargo, este hace:

foo.setFocusableWindowState(false); 
foo.setVisible(true); 
Thread.sleep(1000); 
foo.setFocusableWindowState(true); 

voy a tener que ver si hay un evento que puedo coger/escuchar que me permite do foo.setFocusableWindowStatue(true); cuando sea apropiado.

Considero mi problema resuelto.

+1

¿alguna vez encontró un evento para escuchar cuando se procesó el fotograma? – lordoku

+0

¿Alguien alguna vez encontró un evento para escuchar aquí que funcionó? – wrslatz

Respuesta

13

Esto puede funcionar:

foo.setFocusableWindowState(false); 
+0

Esto realmente parece funcionar, pero tendré que configurar un temporizador o encontrar algún evento para escuchar cuando vuelva a 'setFocusableWindowState' como' true'. –

+0

@Johann también puede intentar usar 'Ventana' en lugar de' JFrame'. Creo que tienes más posibilidades de controlar el foco entonces. – Jonas

0

Sugerencia: En el componente de interfaz gráfica de usuario que crea el marco, poner 2 llamadas consecutivas:

frameJustCreated.requestFocus(); 
this.requestFocus(); 

primero uno traer la ventana de la nueva JFrame a la cima , El segundo mantiene la ventana donde el usuario está escribiendo en la parte superior.

+0

¡Lo siento muchísimo! Debería haber mencionado que esta es la única ventana de la que mi programa está a cargo. Las "otras" ventanas son solo otros programas que el usuario está ejecutando ... –

1

Hace poco me encontré con el mismo problema, y ​​la solución provisional ha sido:

JFrame frame = ...; 
frame.setExtendedState(JFrame.NORMAL); 
frame.setAlwaysOnTop(true); 
frame.requestFocus(); 
frame.setAlwaysOnTop(false); 
+0

que funciona si hay solo un JFrame, y no hay ninguna Tarea de Antecedentes, por favor inicie su propio hilo (si lo desea, con un enlace a este hilo), es un trabajo demasiado difícil sin setVisible (true/flase), pero esta acción es visible en la pantalla, la respuesta es usar JDialog, solo eso (lo que significa Windows OS) puedes hacerlo sin problemas secundarios – mKorbel

+1

Eso no es para nada cierto , ya que tengo varios JFrames ejecutándose en mi aplicación. ¿Por qué iniciar un nuevo hilo cuando el usuario está describiendo el mismo problema exacto que estoy teniendo, pero la solución no está completa? En cuanto a JDialog, no siempre es apropiado para el propósito previsto de la ventana, que es mi caso también. –

+0

sí, quizás lo hago sin parpadeo, pero este código es más largo que este hilo, realmente no es bueno, no cambies Focus betweens dos o más JFrames, traiga un JFrame al otro, Focus (lo mismo que JFrame o JDialog) vino desde el sistema operativo nativo y es asíncrono, entonces es tan difícil de manejar, – mKorbel

2

A partir de Java 1.7 se puede llamar

frame.setAutoRequestFocus(false); 
0

Si desea llamar setFocusableWindowState (verdadero) en un evento (por lo tanto, no esperar, por ejemplo, 1 segundo), puede agregar un WindowListener (por ejemplo, derivado de WindowAdapter) que cambia la propiedad:

appFrame.addWindowListener(new WindowAdapter() { 
     @Override 
     public void windowOpened(WindowEvent e) { 
      super.windowOpened(e); 
      e.getWindow().setFocusableWindowState(true); 
     } 
    }); 

    appFrame.setFocusableWindowState(false); 
    appFrame.setVisible(true); 
Cuestiones relacionadas