2009-05-15 25 views
7

Estoy desarrollando una aplicación java con swing en Windows.Cómo evitar presionar la tecla ALT quita el foco de mi GUI

El problema es: después de presionar (y soltar) la tecla ALT, la siguiente pulsación de tecla no tiene efecto (no habrá un evento activado por tecla). Solo se reconocerá la liberación de la siguiente clave. Al presionar y soltar CTRL o SHIFT después de ALT no tiene ningún efecto. Primero debe presionar otra tecla o hacer clic en el componente para recibir eventos clave desde CTRL o SHIFT nuevamente.

Probablemente, Windows aleja el foco de mi componente GUI hacia el título/menú del marco. Necesito ALT + MouseWheel para mover un gráfico en mi aplicación, si después quiero ampliar el gráfico con CTRL + MouseWheel, esto no funcionará. Entonces, ¿cómo detener ALT de quitar el foco (pero aún así poder acceder a un elemento de menú con, por ejemplo, ALT + F)?

Ya probé Component.requestFocus() - pero en realidad mi componente no pierde realmente el foco.

Un ejemplo simple que muestra el comportamiento:

import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import javax.swing.JFrame; 
import javax.swing.JTextField; 

class MyKeyListener implements KeyListener { 
public void keyTyped(KeyEvent arg0) {} 

public void keyPressed(KeyEvent arg0) { 
    System.out.println("Key perssed: " + arg0.getKeyCode()); 
} 
public void keyReleased(KeyEvent arg0) { 
    System.out.println("Key released: " + arg0.getKeyCode()); 
} 
} 

public class KeyListenerDemo { 

public static void main(String[] a) { 
    JFrame frame = new JFrame("Keytest"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setFocusTraversalKeysEnabled(true); 
    JTextField textField = new JTextField(); 
    textField.addKeyListener(new MyKeyListener()); 
    frame.add(textField); 
    frame.setSize(300, 200); 
    frame.setVisible(true); 
} 
} 
+2

¿Podría consumir() los KeyEvents para la tecla ALT? Supongo que el problema con esto sería que rompería la funcionalidad normal de la tecla ALT en Windows. –

+0

no, quiero mantener Windows funcionalmente: para acceder a la barra de menú. Entonces, en realidad, la pregunta no es cómo evitar el interruptor de enfoque, sino cómo recuperar el foco. –

+0

tipo de solución: Scott, tenías razón. en mi caso, el consumo() realmente funcionó. Puedo usar ALT junto con la rueda del mouse para mi funcionalidad, pero aún así acceder al menú con, p. ALT + F –

Respuesta

5

En mi caso lo siguiente trabajaron: KeyEvent.consume()

Consume este evento para que no se procesará en la forma predeterminada por la fuente de la que lo originó.

Esto evita que Windows me robe el foco, pero aún puedo acceder a mis elementos de menú con las teclas de teclado con ALT.

Gracias a Scott W por su comentario !!

0

creo que no es posible, al menos no en su apogeo. Cada aplicación de swing que he usado tenía el mismo problema. Es una de las principales razones por las que renuncié al uso de Netbeans IDE, aunque el IDE es en general muy agradable. Las aplicaciones SWT no tienen ese problema.

+0

Ya tenía miedo de obtener esa respuesta ; (¿pero no hay alguna solución alternativa para obtener el foco clave? –

+0

No es que yo sepa. – Marko

Cuestiones relacionadas