teclado keypressed ejemplo java swing graphics event-handling keylistener

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(); } }