Java bloqueando el enfoque de JComponent
He hecho un gui para mi aplicación. El JFrame tiene 2 JPanels, panel1 y panel2. Panel1 es solo eso, un JPanel con una pintura personalizada que se vuelve a pintar cada 5 ms.
panel2 es mi primer intento de implementación de CardLayout: contiene JPanels subPanel1 & subPanel2. subPanel1 contiene un JComboBox y se agrega a panel2:panel2.add(subPanel1);
.
subPanel2 tiene el.setLayout(new CardLayout());
comando, y agrego 3 nuevos JPanels en él, con el itemListener apropiado y todo. Por supuesto también lo agrego:panel2.add(subPanel2);
Ahora al problema: enfocar componentes en Java. Tengo conocimiento de metodossetFocusable(boolean)
yrequestFocus()
. Pero no puedo hacer que se comporten de una manera lógica.
Primero, el problema raíz de todos ellos: cuando el cuadro combinado se enfoca, no puedo desenfocarlo en absoluto (intenté hacer clic en todas partes con el cursor).
Los siguientes son los experimentos que he realizado:
1) sin que haya ningún código que habla para enfocar a lo largo de la aplicación, el cuadro combinado comienza con el foco, sin importar qué orden se agreguen panel1 y panel2 al JFrame.
2) si configuropanel1.setFocusable(true);
(En su constructor) comenzará con el foco.
3) si configuropanel1.setFocusable(false);
y también le pedimos que se enfoque, no lo consigue. (Lo único que funciona como se espera)
4) si configuro panel2, subPanel1 o subPanel2 desenfocable individualmente o en cualquier combinación, aún pueden recibir el foco (el cuadro combinado, es decir, que es el único componente capaz de registrar el foco).
5) si configuro el cuadro combinado como desenfocable, aún puedo desplazarme entre las tarjetas en el CardLayout con el elemento 'boxListener' de la caja, pero el enfoque no se mantiene. De hecho panel1 todavía registra entradas de teclado
Así que realmente estoy muy confundido acerca de todo el asunto del 'enfoque'. Tal vez no sea lo que asumo que es? Lo que estoy tratando de hacer es bloquear por completo toda la interacción con el panel2 hasta que una bandera (que se evalúa cada 5 ms) sea verdadera. ¿Tengo razón al suponer que, a diferencia de JPanels, el JComboBox tiene automáticamente un detector de mousebutton para ganar el foco cuando se hace clic? si no, ¿cómo desactivo por completo el JComboBox y todos los componentes que muestra la tarjeta actual? ¿Es normal que los componentes dentro de un componente desenfocable sigan siendo enfocados?