Salve ho un problema con il gioco che sto implementando: Forza4.. praticamente devo fare in modo che quando clicco sulla griglia che ho creato, mi appare un cerchio che mi occupi la posizione invocando un repaint(). Sto cercando di far questo in tutti i modi ma con scarsi risultati. vi allego il codice con la speranza che qualcuno riesca ad aiutarmi:
codice:
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.*;
import java.net.URL;
import javax.swing.*;

class Piattaforma2 extends JPanel
{
    private static JLabel labelUtente = new JLabel();
    final static int diametro = 100;
    final static int spazio = 15;
    private static int colonne = 7; // definiamo il numero di colonne
    private static int righe = 6; // definiamo il numero di righe
    private static Color[][] griglia;
    private static int turno = 0;
    private static Graphics2D g2;
    private static Graphics2D pedina;
    /*
     * definiamo le immagini delle pedine da dover porre all' interno della scacchiera 
     */
    URL urlR = getClass().getResource("../Immagini/rosso.png"); 
    URL urlG = getClass().getResource("../Immagini/giallo.png");
    private ImageIcon rossa = new ImageIcon(urlR);
    private ImageIcon gialla = new ImageIcon(urlG);
    
    private static String modificato;
    private static Color coloreGiocatore1; // definiamo il colore dell'utente
    private static Color coloreGiocatore2;

    public Piattaforma2()
    {        
        /*
         * Dobbiamo definire altri tre JPanel oppure solo label, due che identificano l'utente 
         * a cui tocca e un altro che fa una scansione del tempo
         */
        cominciaPartita();
        
        premiColonna();
        
        // qà qui definamo l'azione del mouse che con un click farà scendere la pallina (vedi MouseListener)
        //setPreferredSize (new Dimension(700,700)); // settare le immagini del JPanel
    }

    
    /*
     * definiamo un metodo all'interno del costruttore che si occuperà di far iniziare la partita
     */
    public void cominciaPartita()
    {
        griglia = new Color[colonne][righe];
        modificato = "no";
        /*
         * qui definire il label che stabilisce a chi tocca: 
         * LabelToccaUtente x = new LabelToccaUtente();
         * add(x);
         * la stessa cosa si deve fare per il timer
         */
        coloreGiocatore2 = Color.YELLOW;
        coloreGiocatore1 = Color.RED; // il primo a cominciare a giocare è l'utente con la pallina rossa        
        labelUtente.setIcon(rossa);
        labelUtente.setLocation(700, 400);        
        //this.repaint();
        //System.out.println("Comincia partita");
    }
    /*
     * definiamo l'immagine della griglia che ospiterà le pedine
     */
    public void paintComponent(Graphics g)
    {         
        super.paintComponent(g);
        //g.setColor(Color.BLUE);
        g2 = (Graphics2D) g;       
        g2.setColor(Color.BLUE);
        g2.fillRect(0, 0, getSize().width, getSize().height); // settare le dimensioni del panel
        /*
         *  disegniamo un rettangolo le cui dimensioni si adattano al pannello (ultimi due parametri)
         * e i primi due danno la posizione di partenza del rettangolo
         */
        for (int i=0; i<colonne; i++)
            {
            
                for (int j=0; j< righe; j++)
                {
                    g2.setColor(Color.WHITE);                
                    //definiamo il colore che deve avere l'ovale
                    /*
                     * disegniamo l'ovale che conterrà le pedine. Come coordianate affinchè possa ripetersi l'ovale 
                     * per il numero di volte che a noi serve, ci poniamo lo spazio
                     */   
                    g2.fillOval((spazio + (spazio + diametro)*i), (spazio + (spazio + diametro)*j) ,diametro, diametro);                    
                          
            }
        }
    }
    
    /*
     * definiamo che ci permetterà di premere la colonna e di far cadere la pedina
     */
    
    private void premiColonna()
    {
        Clicca clicca = new Clicca();
        this.addMouseListener(clicca); // il this si riferisce allo stesso JPanel che stiamo considerando
        //this.addMouseMotionListener(clicca);
       
    }

    private class Clicca implements MouseListener // è stato tolto il MouseMotionListener che ascolta gli spostamenti del mouse
    {  
        //private static int righe;
        private int colonna;
        private int riga;          
        /*
         * tra tutti i metodi che potevamo sovrascrivere si è deciso di sovrascrivere MouseMoved
         * o come alternativa MousePressed
         */
        @Override
        public void mouseClicked(MouseEvent evento)
        {
            /*
             *  metodo fondamentale che serve ad individuare la posizione dell'azione che 
             * stiamo per compiere 
             */
            gioca(evento.getPoint()); 
        }

        @Override
        public void mousePressed(MouseEvent evento)
        {
           // throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            //throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public void mouseEntered(MouseEvent e) {
            //throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public void mouseExited(MouseEvent e) {
            //throw new UnsupportedOperationException("Not supported yet.");
        }

                
        private void gioca(Point point) // serve a determinare la posizione
        {
            /*
             * individuiamo la posizione della colonna
             */            
            colonna = point.x / (diametro + spazio);            
            riga = point.y / (diametro + spazio);        
           // se la colonna non è occupata..
            if(griglia[colonna][riga]==null)
            {                               
                // ..la occupo    
                setDoubleBuffered(true); // salva la posizione 
                for(riga = righe - 1; riga >= 0; riga--) // scansiono le righe dall' ultima alla prima e controllo....
                {                   
                    //...se le riga di competenza non è occupata... 
                    if(griglia[colonna][riga]==null) 
                    {                       
                        //..la occupo con il colore con cui si inizia
                        griglia[colonna][riga] = coloreGiocatore1;
                        modificato = "si";
                        repaint();
                        /*
                         * qui praticamente dovrebbe andare il suono che si attiva quando viene inserita la pedina
                         */                                                
                             
                        // METODO CHE CONTROLLA LO STATO DELLA PARTITA, DA IMPLEMENTARE
                        
                       /* if(turno==0)
                        {
                            if(coloreGiocatore1 == Color.RED)
                            {    
                                // qui il label che andiamo a definire che decreta a ki tocca si illumina 
                                // e l'altro si oscura
                               labelUtente.setIcon(rossa);
                            }
                            else if(coloreGiocatore2 == Color.YELLOW)
                            {
                                labelUtente.setIcon(gialla);
                            }
                        }
                        turno = 0; // riazzera */
                     }
                     }
            }            
        
    }
    
    }
        
    
    }