Hola que tal.
Antes que nada revisando la documentación sobre
KeyListeners encuentras la información que necestas. Sin embargo paso a explicar lo que sucede.
Cuando escuchas un evento de teclado sobre un componente, es necesario saber sobre que componente el evento va ser escuchado, por ejemplo, si tengo dos JPanel, y cada uno tiene su propio KeyListener, al abrir la aplicación y oprimir una tecla, el programa no sabrá a cual de los dos Listeners estoy haciendo referencia, por esta razón es necesario tener un mecanismo que permita identificar que componente debe procesar el evento, para esto se hace uso del Foco, si el primer panelpanel tiene el Foco, entences este responderá al evento, si el segundo lo tiene, el segundo lo hará. Lo que falta en tu código es un mecanismo efetivo para asignar el foco al componente determinado.
En primer lugar, el método:
setFocusable(boolean b) no debería estar en el JFrame, sino más bien en el JPanel:
setBackground
(Color.
WHITE); addMouseListener(this);
addKeyListener(this);
setFocusable(true);
}
Ahora que nuestro Panel tiene la habilidad de obtener foco, debemos definir como debe hacerlo, en este caso lo haremos al hacer click sobre este, para esto simplemente agregamos una linea de código más al método sobreescrito
mouseClicked(Event e):
System.
out.
println("Hola mundo"); requestFocusInWindow();
}
En este momento al hacer click sobre el Panel este obtendrá el foco dentro de la ventana, ahora si oprimes alguna tecla, verás como los eventos son correctamente procesados.
PD: Usar
requestFocusInWindow() envés de
requestFocus(). El primero otorgará el foco al componente dentro de la ventana que se encuentre, el segundo robará el foco de otras ventanas que estén abiertas (como las de otros programas)
Espero sea de ayuda.
Saludos