PDA

View Full Version : [JAVA] Problema KeyListener


Cory
17-07-2009, 17:33
Sto facendo un programma che, disegnato un pallino al centro di un pannello, lo sposti di 10 pixel alla pressione di 'a', 's', 'w' e 'z'. Tuttavia nella classe che implementa il Key Listener non so bene che scrivere..ecco come l'ho fatta per ora.

package ex3;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Pane extends JPanel{

Dimension paneSize=this.getSize();
int x=400/2-25/2;
int y=300/2-25/2;

protected void paintComponent(Graphics g){

g.setColor(Color.RED);
g.fillOval(x, y, 25, 25);

}

public Pane(){

this.setFocusable(true);
this.addKeyListener(new Move());

}

class Move implements KeyListener{

public void keyTyped(KeyEvent e) {}
public void keyPressed(KeyEvent e) {

if(e.getKeyChar()=='a'){

x=x+10;
repaint();
}
}
public void keyReleased(KeyEvent e) {}
}

}

mi sono stampato il tutotial della Sun sui KeyListener ma non mi ha dato nessuna info..

PGI-Bis
17-07-2009, 18:13
Usa e.getKeyCode() == KeyEvent.VK_A. Potrebbe essere necessario un click del mouse sul pannello prima che questo inizi a reagire agli eventi da tastiera per via del focus. Comunque il codice è ok.

malocchio
20-07-2009, 10:21
Usa e.getKeyCode() == KeyEvent.VK_A. Potrebbe essere necessario un click del mouse sul pannello prima che questo inizi a reagire agli eventi da tastiera per via del focus. Comunque il codice è ok.
Per evitare il problema del focus, una soluzione postata da Banryu tempo fa, che ritornò utile anche a me:
http://www.hwupgrade.it/forum/showpost.php?p=23112750&postcount=3

banryu79
20-07-2009, 10:31
Credo che per il focus basti prima richiederlo invocando requestFocusInWindow sul componente.

Cory
20-07-2009, 11:58
Credo che per il focus basti prima richiederlo invocando requestFocusInWindow sul componente.

sì, infatti ho implementato un mouselistener che invocasse proprio il metodo requestFocusInWindow e funziona tutto a meraviglia :)

malocchio
20-07-2009, 12:20
Credo che per il focus basti prima richiederlo invocando requestFocusInWindow sul componente.

Mi devo documentare allora...:doh: