Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > KeyListener no funciona

no soy capaz de hacer funcionar este keyListener, para probarlo puse un mensaje sencillito que nunca sale en pantalla

public class Ventana extends JFrame implements MouseListener,KeyListener {
public int n1,n2;
Panel panel;
JButton boton1;
int pulso1;
Botones botones;

public Ventana() throws InterruptedException{

int anchura=407;
int altura=500;
this.setBounds(0,0,anchura,altura);
this.setTitle("ventana");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setVisible(true);


//objetos creados

panel=new Panel();
//añadidos

this.addKeyListener(this);

this.addMouseListener(this);

this.add(panel);



}
//--------------------------------------------------------------------------------------------------------------------------------------MouseListener
@Override
public void mouseClicked(MouseEvent e) {



if((e.getModifiers() & InputEvent.BUTTON1_MASK) == InputEvent.BUTTON1_MASK){

panel.rectangular(e.getX()-8, e.getY()-30);

panel.posiciony=e.getY()-30;
panel.posicionx=e.getX()-8;


panel.contador=panel.contador+e.getClickCount();

}

if((e.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK){
panel.triangular(e.getX()-8, e.getY()-30);
}

}

@Override
public void mousePressed(MouseEvent e) {
// throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

@Override
public void mouseReleased(MouseEvent e) {
// throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

@Override
public void mouseEntered(MouseEvent e) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

@Override
public void mouseExited(MouseEvent e) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------KeyListener


@Override
public void keyTyped(KeyEvent e) {
if (e.getKeyCode()==KeyEvent.VK_ENTER) {

System.out.println("presiono enter");
}

}

@Override
public void keyPressed(KeyEvent e) {
System.out.println("presiono enter");

}

@Override
public void keyReleased(KeyEvent e) {
if (e.getKeyCode()==KeyEvent.VK_ENTER) {

System.out.println("presiono enter");
}
}


}

diciembre 21, 2014 | Unregistered CommenterRober

No te funciona por dos motivos:

1.- Los JFrame no adquieren el foco por defecto.
Es imprescindible usar algo como ésto:
setFocusable(true);
addKeyListener(new KeyAdapter() {


@Override
public void keyTyped(KeyEvent e) {
System.out.println("prueba: tecla escrita");
}

@Override
public void keyPressed(KeyEvent e) {
System.out.println("prueba: tecla pulsada");
}

@Override
public void keyReleased(KeyEvent e) {
System.out.println("prueba: tecla liberada");
}
});
Aparte de que no se debe implementar KeyListener, porque el listener debe añadirse después de establecer el foco. Si lo implementas en el JFrame no funcionará, aunque establezcas el foco en el JFrame.

2.- Lo anterior solo sirve cuando el JFrame está vacío, porque en cuanto añadas algún componente al JFrame, el foco siempre irá a los componentes.

¿Cuál es el motivo para añadir un listener de teclado al JFrame?.

diciembre 22, 2014 | Registered Commenterchoces

muchas gracias por contestar, no tenía ni idea, probare a ponerle en el jpanel

diciembre 25, 2014 | Unregistered CommenterRober

Guenas.

Los listener deberias ponerlos siempre en el componente que los va a capturar porque suelen tener su propio listener por defecto.

Si quieres que un container superior los pille deberías escribir un código en el listener inferior que llamara al contenedor superior, es decir, delegara su función arriba.

Los eventos aunque se escriban de arriba-abajo siempre se ejecutan de abajo-arriba.

Quizá es un poco liado pero un consejo es que crees componentes de tus beans del mas simple al mas complejo y que cada uno transmita hacia arriba lo que no va a gestionar personalmente.
En plata:
Crea tus propios beans que agrupen los beans mas bajos com JLabel, JButton, etc y haz un tratamiento propio que si lo consideras necesario pasen el evento a su contenedor.

Un saludo

diciembre 31, 2014 | Unregistered CommenterPaposo

Muchas gracias amigo, se que hace años posteaste esta pregunta, pero te puedo decir que me has salvado la vida jajaja

junio 20, 2019 | Unregistered CommenterEM Machado