keypressed - Usando KeyListener con Java
keypressed keyevent e java (1)
Para una tarea, necesito crear un programa que muestre esencialmente una pelota y el usuario debería poder moverla usando las teclas izquierda y derecha. Sin embargo, el programa no responde a las claves. No sé dónde está el error, ¡y agradecería mucho si alguien pudiera ayudar! Este es el código:
public class GraphicsComponent extends JComponent
{
Ellipse2D.Double ball = new Ellipse2D.Double(200, 400, 80, 80);
public void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.RED);
g2.fill(ball);
g2.draw(ball);
}
}
public class BallViewer
{
public static void main(String[] args)
{
JFrame frame = new JFrame(); //creates a new JFrame called frame
frame.setSize(600,600); //invokes the method setSize on the implicit parameter frame
frame.setTitle("Move this Ball"); //sets the title of the fram
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final GraphicsComponent g = new GraphicsComponent(); //creates a new GraphicsComponent called g, is final so that the inner class can access it
frame.add(g);//adds component g to the frame
frame.setVisible(true); //sets the visibility of the frame
class PressListener implements KeyListener //creates an inner class that implements MouseListener interface
{
public void keyPressed(KeyEvent e)
{
if (e.getKeyCode() == KeyEvent.VK_LEFT)
{
System.out.println("Left key pressed");
}
if (e.getKeyCode() == KeyEvent.VK_RIGHT)
{
System.out.println("Right key pressed");
}
}
public void keyReleased(KeyEvent e)
{
}
public void keyTyped(KeyEvent e)
{
}
}
PressListener listener = new PressListener();
g.addKeyListener(listener);
}
}
KeyListener
solo responderá cuando el componente que está registrado sea enfocable Y tenga JComponent
, JComponent
no se puede JComponent
por defecto.
En lugar de eso, usa enlaces de teclas , te ahorran toda la molestia de lidiar con problemas de enfoque relacionados con KeyListener
También vas a tener problemas para hacer que Ellipse2D
mueva, comienza estableciendo su posición como 0x0
y traduciendo el contexto de Graphics
a la posición en la que quieres pintar la bola.
Como ejemplo...
InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
ActionMap am = getActionMap();
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "up");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "down");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "left");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "right");
am.put("up", new DeltaAction(0, -10));
am.put("down", new DeltaAction(0, 10));
am.put("left", new DeltaAction(-10, 0));
am.put("right", new DeltaAction(10, 0));
Y el point
DeltaAction
... es la ubicación en la que está pintada la Ellipse
...
public class DeltaAction extends AbstractAction {
private int deltaX;
private int deltaY;
public DeltaAction(int deltaX, int deltaY) {
this.deltaX = deltaX;
this.deltaY = deltaY;
}
@Override
public void actionPerformed(ActionEvent e) {
point.x += deltaX;
point.y += deltaY;
if (point.x < 0) {
point.x = 0;
} else if (point.x + DIAMETER >= getWidth()) {
point.x = getWidth() - DIAMETER;
}
if (point.y < 0) {
point.y = 0;
} else if (point.y + DIAMETER >= getHeight()) {
point.y = getHeight() - DIAMETER;
}
repaint();
}
}