PDA

View Full Version : Java - why is my KeyListener not working?


farrell2k
June 20th, 2008, 02:54 AM
Does anyone know why my app is not responding properly to key presses?

Thank you.


package game;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class Game extends JPanel
{
int up = 0, down = 1, left = 2, right = 3, still = 4;
int p1Direction;
int speed;

Rectangle p1 = new Rectangle(100,100,30,30);

public Game()
{
//start Thread
MoveP1 moveP1 = new MoveP1();
moveP1.start();

}

public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.red);
g.fillRect(p1.x,p1.y,p1.width,p1.height);


}

public class MoveP1 extends Thread implements KeyListener
{
public void run()
{
addKeyListener(this);

while(true)
{

repaint();

try
{
if (p1Direction == down)
{
p1.y++;
System.out.println(p1.x + " " + p1.y);
}

Thread.sleep(60);


}

catch(Exception e)
{
e.printStackTrace();
}
}
}

public void keyTyped(KeyEvent event)
{

}

public void keyPressed(KeyEvent event)
{
if (event.getKeyChar() == 's')
{
p1Direction = down;
System.out.println("You are pressing s.");
}
}

public void keyReleased(KeyEvent event)
{

}
}


public static void main (String[]args)
{
Game game1 = new Game();

JFrame frame = new JFrame("game test");
frame.setSize(800,600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOS E);
frame.getContentPane().add(game1);
frame.setVisible(true);
}

}

xlinuks
June 20th, 2008, 04:38 AM
One must explicitly tell Java that JPanel should receive focus and such types of events, thus your constructor should look like this:

public Game() {
//start Thread
setFocusable( true ); //this line has been added
MoveP1 moveP1 = new MoveP1();
moveP1.start();

}


btw, I would suggest using the code tags for the code to be readable for people who read your post(s).

reality1011
June 20th, 2008, 04:39 AM
Does anyone know why my app is not responding properly to key presses?

Thank you.


package game;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class Game extends JPanel
{
int up = 0, down = 1, left = 2, right = 3, still = 4;
int p1Direction;
int speed;

Rectangle p1 = new Rectangle(100,100,30,30);

public Game()
{
//start Thread
MoveP1 moveP1 = new MoveP1();
moveP1.start();

}

public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.red);
g.fillRect(p1.x,p1.y,p1.width,p1.height);


}

public class MoveP1 extends Thread implements KeyListener ==> this is the problem
{
public void run()
{
addKeyListener(this); ==> this is why ....Dont add actionlisteners to threads

while(true)
{

repaint();

try
{
if (p1Direction == down)
{
p1.y++;
System.out.println(p1.x + " " + p1.y);
}

Thread.sleep(60);


}

catch(Exception e)
{
e.printStackTrace();
}
}
}

public void keyTyped(KeyEvent event)
{

}

public void keyPressed(KeyEvent event)
{
if (event.getKeyChar() == 's')
{
p1Direction = down;
System.out.println("You are pressing s.");
}
}

public void keyReleased(KeyEvent event)
{

}
}


public static void main (String[]args)
{
Game game1 = new Game();

JFrame frame = new JFrame("game test");
frame.setSize(800,600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOS E);
frame.getContentPane().add(game1);
frame.setVisible(true);
}

}



Actionlisteners are for Components not Classes which extend threads. Try creating a textfield, adding an actionlistener....

Here I did it for you... type some text and then press enter....




import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class Game extends JPanel
{
int up = 0, down = 1, left = 2, right = 3, still = 4;
int p1Direction;
int speed;

Rectangle p1 = new Rectangle(100,100,30,30);

public Game()
{
//start Thread
MoveP1 moveP1 = new MoveP1(20); // NOW EXTENDS JTEXTFIELD not Thread
//moveP1.start();
add(moveP1);

}

public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.red);
g.fillRect(p1.x,p1.y,p1.width,p1.height);


}

public class MoveP1 extends JTextField implements KeyListener
{


public MoveP1(int i){
super(i);
addKeyListener(this); //==> this is why ....

}

public void keyTyped(KeyEvent event){}


public void keyPressed(KeyEvent event)
{
if (event.getKeyText(event.getKeyCode()).equals("Enter"))
{

System.out.println("Getting the current value of this field:" + this.getText());
}
}

public void keyReleased(KeyEvent event){}
}


public static void main (String[]args)
{
Game game1 = new Game();

JFrame frame = new JFrame("game test");
frame.setSize(800,600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOS E);
frame.getContentPane().add(game1);
frame.setVisible(true);
}

}