Coger eventos de teclado en Java

Buenas estoy haciendo un comecocos, y ahora mismo lo dibujo y empieza el movimiento automaticamente hacia la derecha, pero cuando intento mover el pacman, no me coge los eventos de teclado, y no se porque puede ser....

Aquí os dejo el código:

Main.java
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package comecocos;

/**
*
* @author ismaelrodriguezmoreno
*/
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        System.out.println("Depuracion");
        Tablero t= new Tablero();
        System.out.println("Depuracion");
        MiCanvas lienzo = new MiCanvas(t);
        System.out.println("Depuracion");
        Marco m = new Marco(lienzo);
        System.out.println("Depuracion");
        Movimientos  mov = new Movimientos(t,lienzo);
        lienzo.setMueve(mov);
        mov.reanudar();
    }
}


Tablero.java
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package comecocos;

/**
*
* @author ismaelrodriguezmoreno
*/
public class Tablero {
String rejilla[] = {"BBBBBBBBBBBBBBBBBBBBBBBBBBBB",
    "B............BB............B",
    "B.BBBB.BBBBB.BB.BBBBB.BBBB.B",
    "BoBBBB.BBBBB.BB.BBBBB.BBBBoB",
    "B.BBBB.BBBBB.BB.BBBBB.BBBB.B",
    "B..........................B",
    "B.BBBB.BB.BBBBBBBB.BB.BBBB.B",
    "B.BBBB.BB.BBBBBBBB.BB.BBBB.B",
    "B......BB....BB....BB......B",
    "BBBBBB.BBBBB BB BBBBB.BBBBBB",
    "     B.BBBBB BB BBBBB.B     ",
    "     B.BB          BB.B     ",
    "     B.BB BB____BB BB.B     ",
    "BBBBBB.BB B      B BB.BBBBBB",
    "      .   B      B   .      ",
    "BBBBBB.BB B      B BB.BBBBBB",
    "     B.BB BBBBBBBB BB.B     ",
    "     B.BB          BB.B     ",
    "     B.BB BBBBBBBB BB.B     ",
    "BBBBBB.BB BBBBBBBB BB.BBBBBB",
    "B............BB............B",
    "B.BBBB.BBBBB.BB.BBBBB.BBBB.B",
    "B.BBBB.BBBBB.BB.BBBBB.BBBB.B",
    "Bo..BB................BB..oB",
    "BBB.BB.BB.BBBBBBBB.BB.BB.BBB",
    "BBB.BB.BB.BBBBBBBB.BB.BB.BBB",
    "B......BB....BB....BB......B",
    "B.BBBBBBBBBB.BB.BBBBBBBBBB.B",
    "B.BBBBBBBBBB.BB.BBBBBBBBBB.B",
    "B..........................B",
    "BBBBBBBBBBBBBBBBBBBBBBBBBBBB"};
    static final char BLOQUE = 'B'; // Tipos de celda de Tablero
    static final char CASILLA = '.';
    static final char CASILLA_VACIA = ' ';
    static final char CASILLA_COMIDA = 'o';
    static final char PUERTA = '_';
    static final char PACMAN = 'X';
    private char[][] celdas;
    private static final int ANCHO = 28;
    private static final int ALTO = 31;
    private Pacman pac;


    public Tablero(){
        System.out.println("Dentro de Tablero");
        pac = new Pacman();
        System.out.println("Pacman Creado");
        String c ;
        char carac;
        int x=0;
        celdas= new char[ALTO][ANCHO];
        for(int i=0;i<ALTO;i++){
            c=rejilla[i];
            for(int j=0;j<ANCHO;j++){
                carac=c.charAt(j);
                if( carac==BLOQUE)
                    celdas[i][j]=carac;
                if(carac ==CASILLA)
                    celdas[i][j]=carac;
                if(carac ==CASILLA_VACIA)
                    celdas[i][j]=carac;
                if(carac ==CASILLA_COMIDA)
                    celdas[i][j]=carac;
                if(carac ==PUERTA)
                    celdas[i][j]=carac;
                x++;
            }
        }
        celdas[23][13]=PACMAN;
        pac.SetDireccion(Pacman.DERECHA);
        System.out.println("Fin de tablero");
    }

    public int Get(int fila,int columna){
        return celdas[fila][columna];
    }
    public void Set(int fila,int columna,char c){
        celdas[fila][columna]=c;
    }
    public int GetFilas(){
        return ALTO;
    }
    public int GetColumnas(){
        return ANCHO;
    }
    public void SetDireccion(int d){
        pac.SetDireccion(ALTO);
    }

    public int PosicionPacman(){
        System.out.println("Dentro de posicion Pacman");
        Coordenada co =  pac.MuevePacman();
        Coordenada coord= null;
        int dev = 0;

        if(celdas[co.GetFila()][co.GetColumna()] == CASILLA ){
            celdas[co.GetFila()][co.GetColumna()]= PACMAN;
            coord = this.CoordenadaAnterior(co, pac.GetDireccion());
            celdas[coord.GetFila()][coord.GetColumna()]= CASILLA_VACIA;
            dev=CASILLA;
        }
        if(celdas[co.GetFila()][co.GetColumna()] == CASILLA_COMIDA){
            celdas[co.GetFila()][co.GetColumna()]= PACMAN;
            coord = this.CoordenadaAnterior(co, pac.GetDireccion());
            celdas[coord.GetFila()][coord.GetColumna()]= CASILLA_VACIA;
            dev=CASILLA_COMIDA;
        }
        if(celdas[co.GetFila()][co.GetColumna()] == CASILLA_VACIA){
            celdas[co.GetFila()][co.GetColumna()]= PACMAN;
            coord = this.CoordenadaAnterior(co, pac.GetDireccion());
            celdas[coord.GetFila()][coord.GetColumna()]= CASILLA_VACIA;
            dev=CASILLA_VACIA;
        }
        if(celdas[co.GetFila()][co.GetColumna()] == BLOQUE){
            coord=this.DeterminarPosicion(co,pac.GetDireccion());
            celdas[coord.GetFila()][coord.GetColumna()]= PACMAN;
            dev=BLOQUE;
        }
        return dev;
    }



    private Coordenada DeterminarPosicion(Coordenada cod,int dir){
        Coordenada co = null;
        if(dir==Pacman.DERECHA){
            co = new Coordenada(cod.GetFila(),cod.GetColumna()-1);
        }
        if(dir==Pacman.IZQUIERDA){
            co = new Coordenada(cod.GetFila(),cod.GetColumna()+1);
        }
        if(dir==Pacman.ARRIBA){
            co = new Coordenada(cod.GetFila()-1,cod.GetColumna());
        }
        if(dir==Pacman.ABAJO){
            co = new Coordenada(cod.GetFila()+1,cod.GetColumna());
        }
        return co;
    }

    private Coordenada CoordenadaAnterior(Coordenada cod,int dire){
        Coordenada co = null;
        if(dire == Pacman.ABAJO)
            co = new Coordenada(cod.GetFila()+1,cod.GetColumna());
        if(dire == Pacman.ARRIBA)
            co = new Coordenada(cod.GetFila()-1,cod.GetColumna());
        if(dire == Pacman.DERECHA)
            co = new Coordenada(cod.GetFila(),cod.GetColumna()+1);
        if(dire == Pacman.ABAJO)
            co = new Coordenada(cod.GetFila(),cod.GetColumna()-1);
        return co;
    }


}



Pacman.java
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package comecocos;

/**
*
* @author ismaelrodriguezmoreno
*/
public class Pacman {
    private int n_vidas;
    static final int ARRIBA = 2;
    static final int ABAJO = 0;
    static final int DERECHA = 3;
    static final int IZQUIERDA = 1;
    private Coordenada coord;
   
    private int direccion;
    Pacman(){
        n_vidas=3;
        coord = new Coordenada(23,13);
    }

    public void SetDireccion(int d){
        direccion=d;
    }

    public int GetDireccion(){
        return direccion;
    }

    public Coordenada MuevePacman(){
        switch(direccion){
            case IZQUIERDA:
                coord.SetColumna(coord.GetColumna()-1);
                break;
            case DERECHA:
                coord.SetColumna(coord.GetColumna()+1);
                break;
            case ARRIBA:
                coord.SetFila(coord.GetFila()-1);
                break;
            case ABAJO:
                coord.SetFila(coord.GetFila()-1);
                break;
            default:
                break;
        }
        return coord;
    }

}


Movimientos.java
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package comecocos;

import javax.swing.JLabel;

/**
*
* @author ismaelrodriguezmoreno
*/
public class Movimientos implements Runnable {
    private Tablero tab;
    private Pacman pac;
    private MiCanvas cav=null;
    private int puntos;
    private JLabel labelPuntuacion;
    private boolean continuar = true;
    private boolean suspendFlag = true;

    Movimientos(Tablero t,MiCanvas c){
        tab=t;
        cav=c;
        puntos=0;
        Thread hilo= new Thread(this);
        System.out.println("va a comenzar el hilo");
        hilo.start();
        System.out.println("El hilo a terminado?");
    }

    Movimientos(Tablero t, Pacman p, MiCanvas c,JLabel label){
        tab=t;
        pac=p;
        cav=c;
        puntos=0;
        labelPuntuacion=label;
        Thread hilo= new Thread(this);
        hilo.start();
        System.out.println("Comienza el hilo");
    }

    public void run() {
        try{
            System.out.println("Dentro de run");
            while(continuar){
                synchronized(this){
                    while(suspendFlag){
                        System.out.println("Antes de esperar");
                        wait();
                        System.out.println("Esperando");
                    }
                }
                Thread.sleep(500);
                System.out.println("El hilo a dormido");
                int sit = tab.PosicionPacman();
                if(cav!=null)
                    cav.repaint();
                /*if(sit == Tablero.CASILLA)
                   
                if(sit == Tablero.CASILLA_COMIDA)
               
                if(sit == Tablero.CASILLA_VACIA)*/
              }


   /*if((sit==Serpiente.CHOCA_BLOQUE)||(sit==Serpiente.CHOCA_SERPIENTE)){
     suspender();
     inicializaJuego();
     canvas.repaint();
     labelPuntuacion.setText("Puntuaci�n = "+puntuacion);
     reanudar();

   }
   else if(m==Serpiente.COME_RATON){
     puntuacion++;
     labelPuntuacion.setText("Puntuaci�n = "+puntuacion);
   }
            }
        }
        catch(InterruptedException e){
            System.out.println("Hilo Comecocos interrumpido");
        }*/
    }

catch(InterruptedException e){
            System.out.println("Hilo Comecocos interrumpido");
        }
    }

  public synchronized void reanudar(){
    suspendFlag = false;
    notify();
  }



}



MiCanvas.java
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package comecocos;

import javax.swing.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.KeyEvent;

/**
*
* @author ismaelrodriguezmoreno
*/
public class MiCanvas extends JPanel implements KeyListener, MouseListener{
    private Tablero tab;
    private Movimientos mov;
    static final int TAM = 20;

    MiCanvas(Tablero t) {
        tab = t;
        //addMouseListener(this);
        //addKeyListener(this);
  }

   
   
    @Override
    synchronized public void paintComponent(Graphics g){
        Graphics screengc=g;
        g.setColor(Color.BLACK);
        g.fillRect(0,0,getWidth(),getHeight());
        g.setColor(Color.WHITE);
        dibujarTablero(g);
    }


    private void dibujarTablero(Graphics g){
        int x=0,y=0;
        int filas = tab.GetFilas();
        int columnas = tab.GetColumnas();
        for(int i=0;i<filas;i++){
            for(int j=0;j<columnas;j++){
                if(tab.Get(i,j) ==  Tablero.BLOQUE){
                    g.setColor(Color.BLUE);
                    g.fillRect(x, y, TAM,TAM);
                    //g.drawRect(x,y,TAM,TAM);
                }
                if(tab.Get(i,j) ==  Tablero.CASILLA){
                    g.setColor(Color.YELLOW);
                    g.fillArc(x+(TAM/2)-3, y+(TAM/2)-3, 6, 6, 0,360);
                }
                if(tab.Get(i,j) ==  Tablero.CASILLA_COMIDA){
                    g.setColor(Color.YELLOW);
                    g.fillArc(x+(TAM/2)-5, y+(TAM/2)-5,10,10, 0,360);
                }
                if(tab.Get(i,j) ==  Tablero.PUERTA){
                    g.setColor(Color.WHITE);
                    g.drawLine(x, y+TAM, x+TAM, y+TAM);
                }
                if(tab.Get(i, j)== Tablero.PACMAN){
                    g.setColor(Color.YELLOW);
                    g.fillArc(x+(TAM/2)-9, y+(TAM/2)-9, 18, 18, 0, 360);
                }
                x+=TAM;
            }
            x=0;
            y+=TAM;
        }
    }
    @Override
  public boolean isFocusTraversable(){
    return true;
  }

  public void mouseClicked(MouseEvent e){
  }

  public void mouseEntered(MouseEvent e){
    requestFocus();
  }

  public void mouseExited(MouseEvent e){
  }

  public void mousePressed(MouseEvent e){
  }

  public void mouseReleased(MouseEvent e){
  }


  public void keyTyped(KeyEvent evt){
  }

    public void setMueve(Movimientos m){
        mov=m;
    }
   
  public void keyReleased(KeyEvent evt){
   // System.out.println("KeyReleased getKeyCode="+evt.getKeyCode());
   // System.out.println("KeyReleased getKeyChar="+evt.getKeyChar());
   // System.out.println("KeyReleased getModifiers="+evt.getModifiers());
  }
    public void keyPressed(KeyEvent evt) {
        System.out.println("Se ha producido un evento");
        if(evt.getKeyCode()==KeyEvent.VK_UP){
            System.out.println("Pulsado ARRIBA");
            tab.SetDireccion(Pacman.ARRIBA);
        }
        else if(evt.getKeyCode()==KeyEvent.VK_DOWN){
            System.out.println("Pulsado ABAJO");
            tab.SetDireccion(Pacman.ABAJO);
        }
        else if(evt.getKeyCode()==KeyEvent.VK_LEFT){
            System.out.println("Pulsado IZQUIERDA");
            tab.SetDireccion(Pacman.IZQUIERDA);
        }
        else if(evt.getKeyCode()==KeyEvent.VK_RIGHT){
            System.out.println("Pulsado DERECHA");
            tab.SetDireccion(Pacman.DERECHA);
        }
        /*else if(evt.getKeyCode()==KeyEvent.VK_SPACE){
        if(!mueve.getParado())
            mueve.suspender();
        else
            mueve.reanudar();
        }*/
    }
  }


Marco.java
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package comecocos;


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

/**
*
* @author ismaelrodriguezmoreno
*/
public class Marco extends JFrame {
    private MiCanvas lienzo;
    private JLabel ptos;

    public Marco(MiCanvas c){
        /*lienzo = c;
        Button boton = new Button("Salir");
        boton.setName("Salir");
        ptos=new Label("Puntuacion = 0");
        setSize(600,700);
        setLayout(new BorderLayout());
        add("North",ptos);
        add("Center",lienzo);
        add("South",boton);
        setVisible(true);
        lienzo.setVisible(true);
        boton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                if(event.toString().indexOf("on Salir") != -1) {
                    System.exit(0);
                }
            }
        }
        );*/


       lienzo = c;
    JButton boton = new JButton("Salir");
    boton.setName("Salir");
    ptos=new JLabel("Puntuacion = 0");
    setSize(600,700);

    getContentPane().setLayout(new BorderLayout());
    getContentPane().add(ptos,BorderLayout.NORTH);
    getContentPane().add(lienzo,BorderLayout.CENTER);
    getContentPane().add(boton,BorderLayout.SOUTH);
    setVisible(true);
    pack();
    boton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent event) {
        if(event.toString().indexOf("on Salir") != -1) {
          System.exit(0);
   }
      }
    }
    );

    }
}


Coordenada.java
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package comecocos;

/**
*
* @author ismaelrodriguezmoreno
*/
public class Coordenada {
    private int fila;
    private int columna;
    Coordenada(){
        fila=0;
        columna=0;
    }
    Coordenada(int f,int c){
        fila=f;
        columna =c;
    }
    public void SetFila(int f){
        fila=f;
    }
    public int GetFila(){
        return fila;
    }
    public void SetColumna(int c){
        columna=c;
    }
    public int GetColumna(){
        return columna;
    }
    public void SetCoordenada(int f, int c){
        fila=c;
        columna=c;
    }
    public Coordenada GetCoordenada(){
        return this;
    }
}
mete esto mejor dentro del hilo ofical de java en general y no en soft libre
1 respuesta