Salve a tutti,
ho un problema: devo realizzare per scuola un semplice videogioco con Java, ed ho pensato a Snake! Il problema principale, per ora, è che non un modo per rendere il pallino nel pannello sensibile alle freccie direzionali... Vi posto il codice...

codice:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.*;

/*************************************************************
 * una Finestra e' il contenitore dei vari componenti grafici
 *
 */
class Finestra extends JFrame
{
    Finestra(int x0, int y0, int larghezza, int altezza)
    {
        // settaggio caratteristiche della finestra
        setBounds(x0,y0,larghezza,altezza);
        setTitle(getClass().getName());
        setResizable(true);
        setVisible(true);

        // aggiunta di un ascoltatore per poter chiudere il frame
        addWindowListener(new WindowAdapter()
            {
                public void windowClosing(WindowEvent e)
                {
                   System.out.println("Fine dell'applicazione\n");
                   System.exit(0);  // chiusura dell'applicazione
                } // [m] windowClosing
            }
        );

    } // [c] Finestra

} // [class] Finestra

/************************************************
 * un Pannello e' un componente su cui disegnare
 *
 */
class Pannello extends JPanel
{
    //#### (strutture) dati che memorizzano il disegno ####
    private int x_mouse, y_mouse;  // ultimo clic del mouse
    private int b_mouse;           // ultimo bottone del mouse (16=sx, 4=dx)
    private String s = "";         // stringa scritta sul pannello

    private static Font f = new Font("Times New Roman",Font.ITALIC,80);
    private Thread th;
    //private int xg,yg;
    private int[] x = new int [500];
    private int[] y = new int [500];
    //private int pos = 1;
    //private int np = 1;

    private boolean sinistra, destra, su, giu;

    /**
     * costruttore
     */
    public Pannello(int x0, int y0, int lar, int alt)

    {
        // settaggi di configurazione
        setBounds(x0,y0,lar,alt);
        setBorder(new EtchedBorder());
        setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));

        //#### gestione degli eventi intercettati dal pannello ####

        // il pannello viene reso sensibile ai clic del mouse
        addMouseListener(new MouseAdapter()
            {
            //---- gestione del clic del mouse ----
            public void mouseClicked(MouseEvent e)
              {
              x_mouse = e.getX();
              y_mouse = e.getY();
              //pos++;
              //np++;
              // cfr. InputEvent
              b_mouse = e.getModifiers();  // bottone del mouse (16=sx,4=dx)
              s = "";
              repaint(); // richiama paint()
              } // [m] mouseClicked

            //---- gestione dell'entrata del mouse ----
            public void mouseEntered(MouseEvent e)
              {
              setBackground(new Color(255,255,255));
              s = "Per iniziare digita 'start'";
              repaint(); // richiama paint()
              } // [m] mouseEntered

            //---- gestione dell'uscita del mouse ----
            public void mouseExited(MouseEvent e)
              {
              setBackground(new Color(255,255,255));
              repaint(); // richiama paint()
              } // [m] mouseExited

            }
        );

        // il pannello viene reso sensibile ai movimenti del mouse
        addMouseMotionListener(new MouseMotionAdapter()
            {
            //---- gestione del movimento del mouse ----
            public void mouseMoved(MouseEvent e)
              {
              int x = e.getX();
              int y = e.getY();
              //xg = x;
              //yg = y;
              repaint(); // richiama paint()
              } // [m] mouseMoved
            }
        );

        addKeyListener(new KeyAdapter()  // da verificare perchè non vanno le frecce direzionali...
        {
            @Override
            public void keyPressed(KeyEvent q)
            {
				if (q.getKeyCode() == KeyEvent.VK_LEFT)
				{
                    if ((su || giu))
                    {
                        sinistra = true;
                        destra = giu = su = false;
                        x_mouse--;
                    }
                }
                else if (q.getKeyCode() == KeyEvent.VK_RIGHT)
                {
                    if (su || giu)
                    {
                        destra = true;
                        sinistra = giu = su = false;
                        x_mouse++;
                    }
                }
                else if (q.getKeyCode() == KeyEvent.VK_UP)
                {
                    if (destra || sinistra)
                    {
                        su = true;
                        giu = destra = sinistra = false;
                        y_mouse++;
                    }
                }
                else if (q.getKeyCode() == KeyEvent.VK_DOWN)
                {
                    if (destra || sinistra)
                    {
                        giu = true;
                        su = destra = sinistra = false;
                        y_mouse--;
                    }
                }
            }
        });



    } // [c] Pannello

    /**
     * esecuzione di un comando
     */
    public void esegui(String cmd)
    {
        System.out.println("Comando da eseguire = ["+cmd+"]");  // DA FINIRE
        if (cmd.equals("start"))
            attiva();

    } // [m] esegui

    /**
     * ridisegno della parte grafica
     * (questo metodo viene richiamato automaticamente quando la finestra
     * deve essere ridisegnata (ad esempio quando viene sovrapposta
     * da un'altra)
     */
    public void paint(Graphics g)
    {
        super.paint(g);
        g.setColor(Color.blue);
        //for(int i=0;i<=pos;i++)
        	g.fillOval(x_mouse+150,y_mouse+150,10,10);  // piccolo cerchio pieno
        	//g.fillOval(x_mouse+145,y_mouse+145,10,10);
        	//g.fillOval(x_mouse+140,y_mouse+140,10,10);
        //g.setColor(Color.red);
        //g.drawLine(10,10,400,500);
        g.setColor(Color.red);
        g.drawString(s,100,200);
    } // [m] paint

    //#### begin thread ####
    /**
     * - creazione del thread (new Thread())
     * - definizione del comportamento del thread (def. del metodo run())
     * - attivazione del thread (th.start())
     */
    public void attiva()
    {
       th = new Thread()
                {
                // ridefinizione del metodo run
                public void run()
                    {
                      for (;;)  // ciclo infinito
                          {
                          s = "";
                          //x_mouse++; // così all'inizio resta fermo...
                          //y_mouse++;
                          repaint();
                          try {
                              sleep(50);
                              }
                          catch (InterruptedException e)
                              {
                              System.out.println("thread interrotto");
                              return;
                              }
                          } // for
                    }
                };

        th.start();
    } // [m] attiva
    //#### end thread ####

} // [class] Pannello


/*********************************************************************
 * un Campo e' una finestra testo sulla quale si puo' scrivere
 *
 */
class Campo extends JTextField
{
    private static String stringaletta = "";

    /**
     * costruttore
     * Parametri:
     *   lar,alt : larghezza ed altezza
     */
    Campo(int x0, int y0, int lar, int alt)
    {
        setBounds(x0,y0,lar,alt);
        setFont(new Font("Monospaced",Font.PLAIN,11));
        setEditable(true);   // attiva il cursore
        setVisible(true);    // rende visibile

        // intercettamento dell'evento "tasto INVIO"
        addActionListener
            (new ActionListener()
                {
                // quando si batte INVIO stringaletta prende il testo
                public void actionPerformed(ActionEvent e)
                    {
                    stringaletta = "";
                    stringaletta = getText();
                    setText(""); // serve?
                    }
                }
            );

    }  // [c] Campo
    /**
     * lettura di una stringa
     * msg rappresenta la stringa iniziale proposta
     *
     */
    public String leggiStringa(String msg)
    {
        stringaletta = "";
        requestFocus();    // non attiva comunque il cursore
        setEditable(true);
        setText(msg);  // messaggio guida dell'input
        setCaretPosition(msg.length()); // 0 e' all'inizio
        while (stringaletta.equals(""))
            ;
        String rets = stringaletta;
        stringaletta = "";
        setEditable(false);
        return rets;
    } // [m] leggiStringa

    /**
     * lettura di una stringa
     *
     */
    public String leggiStringa()
    {
        return leggiStringa("");
    } // [m] leggiStringa

    /**
     * scrittura di una stringa sul campo testo (come messaggio)
     *
     */
    public void scriviStringa(String s)
    {
        setText(s);
    } // [m] scriviStringa

} // [class] Campo


class Progetto
{
    public static void main(String[] args)
    {
        // creazione finestra e componenti
        Finestra f = new Finestra(10,20,400,550);  // contenitore top-level
        Pannello p = new Pannello(50,50,300,380);  // pannello su cui disegnare
        Campo c    = new Campo(50,450,300,20);     // campo comandi

        // settaggio colore dei componenti
        f.setBackground(new Color(200,100,100));
        f.setTitle("XSnake - versione 1.0");
        p.setBackground(new Color(230,210,190));
        p.setFocusable(true);   // dovrebbe rendere sensibile la pressione sulle freccie direzionali ma...?
        c.setBackground(new Color(210,230,250));

        // assemblaggio del sistema grafico: Finestra+Pannello+Campo
        f.setLayout(null);  // altrimenti il pannello invade tutta la finestra
        f.add(p);           // attacco del pannello alla finestra
        f.add(c);           // attacco del campo alla finestra

        // attivazione del thread associato al pannello
        //p.attiva();

        // visualizzazione
        f.setVisible(true);
        p.repaint();
        p.setFocusable(true);

        // gestione comandi scritti sul campo testo
        String s;
        do  {
            s = c.leggiStringa("");
            p.esegui(s);
            } while (!s.equals("fine"));

    } // [m] main

} // [class] Progetto
Ho provato anche ad aggiungere il comando "p.setFocusable(true);" ma niente da fare...
Se potete aiutarmi ne sarei grato, grazie.
Sen.