salve a tutti, come da titolo ho questo problema.. implementando il KeyListener e il MouseListener aggiungendoli al frame e inserendo tutti i metodi, non capisco perchè funzionino entrambi, ma il KeyListener mi dice che è stato premuto un pulsante solo dopo che ho cliccato con il mouse sul frame..

senza problemi vi posto il codice:

codice:
import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.IOException;
//import javax.media.CannotRealizeException;
//import javax.media.NoPlayerException;
import javax.swing.JFrame;

public class ChooseCharacter extends Canvas implements KeyListener, MouseListener
{
    JFrame f;
    Image sfondo, p0, p1, p2, p3;
    int i;
    ServerConnection s;

    public ChooseCharacter()
    {
    }

    public ChooseCharacter(JFrame frame) throws IOException/*, NoPlayerException, CannotRealizeException*/
    {
        f = frame;
        this.addMouseListener(this);
        this.addKeyListener(this);
        sfondo = Toolkit.getDefaultToolkit().getImage("sfondo.jpg");
        sfondo = sfondo.getScaledInstance(f.getWidth(), f.getHeight(), Image.SCALE_DEFAULT);
        p0 = Toolkit.getDefaultToolkit().getImage("personaggio1.jpg");
        p1 = Toolkit.getDefaultToolkit().getImage("personaggio2.jpg");
        p2 = Toolkit.getDefaultToolkit().getImage("personaggio3.jpg");
        p3 = Toolkit.getDefaultToolkit().getImage("personaggio4.jpg");
        //Main.s = new Sound("SuonoSceltaPersonaggio.mp3");
        i = 0;
       // s = new ServerConnection();
       // s.attendi();
    }

    @Override
    public void paint(Graphics g)
    {
        g = (Graphics2D) g;
        g.drawImage(sfondo, -5, -35, this);

        if (i == 0)
            g.drawImage(p0, -5, -35, this);
        else
            if (i == 1)
                g.drawImage(p1, -5, -35, this);
            else
                if (i == 2)
                    g.drawImage(p2, -5, -35, this);
                else
                    if (i == 3)
                        g.drawImage(p3, -5, -35, this);

    }

    public void mouseClicked(MouseEvent e)
    {
        System.out.print("sono nel mouseclicked");
        //Se clicco nel pulsante di scelta personaggio
       /* if (e.getX()>0 && e.getY()>0)
        {
            try
            {
                f.removeMouseListener(this);
                f.remove(this);
                f.add(new Level1(f, i));
                f.validate();
            }
            catch (IOException ex) {}
            //catch (NoPlayerException ex) {}
            //catch (CannotRealizeException ex) {}
        }*/

        //Pulsante indietro
        if (e.getX()>0 && e.getY()>0)
        {
            if (i == 0)
                i = 3;
            else
                i--;
        }
        
        //Pulsante avanti
        if (e.getX()>0 && e.getY()>0)
        {
            if (i == 3)
                i = 0;
            else
                i++;
        }
    }

    public void mousePressed(MouseEvent e)
    {
    }

    public void mouseReleased(MouseEvent e)
    {
    }

    public void mouseEntered(MouseEvent e)
    {
    }

    public void mouseExited(MouseEvent e)
    {
    }

    public void keyTyped(KeyEvent e)
    {
    }

    public void keyPressed(KeyEvent e)
    {
        System.out.print("pulsante premuto: "+e.getKeyCode());
        //Se ho premuto il pulsante invio allora prendo quel personaggio
        if (e.getKeyCode() == KeyEvent.VK_ENTER)
        {
            try
            {
                f.removeMouseListener(this);
                f.remove(this);
                f.add(new Level1(f, i));
                f.validate();
            }
            catch (IOException ex) {}
            //catch (NoPlayerException ex) {}
            //catch (CannotRealizeException ex) {}
        }

        //Se premo il pulsante su allora torno indietro con il personaggio
        if (e.getKeyCode() == KeyEvent.VK_UP)
        {
            if (i == 0)
                i = 3;
            else
                i--;
        }

        //Se premo il pulsante giù allora torno indietro con il personaggio
        if (e.getKeyCode() == KeyEvent.VK_UP)
        {
            if (i == 3)
                i = 0;
            else
                i++;
        }

        repaint();
    }

    public void keyReleased(KeyEvent e)
    {
    }
}
ovviamente accetto consigli sulla programmazione generale del codice che ho scritto anche se non è riguardante la domanda che ho fatto.. grazie in anticipo..