Quote Originariamente inviata da LeleFT Visualizza il messaggio
Quell'errore accade perchè succede questo (guarda il tuo metodo main):

1) Viene creato il pannello
2) Il pannello viene aggiunto al JFrame
3) Il JFrame viene reso visibile
4) Parte il thread


Ora, il metodo crea() (che è il posto in cui vengono istanziati gli elementi dell'array) viene richiamato dal thread (che viene avviato al punto 4)

Il punto 3, però, richiede al pannello di disegnarsi... questo fa richiamare il paintComponent()... e questo cerca di disegnare gli oggetti dell'array "cerchio"... e l'array cerchio non contiene ancora nulla (il metodo crea() verrà chiamato solo dopo).

Devi rivedere questo passaggio: il metodo paintComponent() dovrebbe PRIMA assicurarsi che l'array sia stato riempito e solo se questa condizione viene verificata, passare al disegno dei suoi componenti.

Per far questo, sposta l'istanziazione dell'array dentro al metodo crea() e fai un banale controllo nel metodo paintComponent():


codice:
public class creaOggetti ... {
   // Questa riga va modificata
   // Oggetto[] cerchio = new Oggetto[MAX_OGGETTI];

   // ... in questo modo
   Oggetto[] cerchio = null;

   ...

   public void crea() {
      // Creo QUI l'array
      cerchio = new Oggetto[MAX_OGGETTI];
      ...   // tutto il resto come prima
   }

   ...

   @Override
   public void paintComponent(Graphics g) {
      super.paintComponent( g );
      if (cerchio != null) {
         ...   // Tutto il resto come prima...
      }
   }
}

Ciao.
Anzitutto grazie! Ho provato a fare come mi hai suggerito però continua a darmi errore:

codice:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at oggetto.creaOggetti.paintComponent(creaOggetti.java:67)
    at javax.swing.JComponent.paint(Unknown Source)
    at javax.swing.JComponent.paintChildren(Unknown Source)
    at javax.swing.JComponent.paint(Unknown Source)
    at javax.swing.JComponent.paintChildren(Unknown Source)
    at javax.swing.JComponent.paint(Unknown Source)
    at javax.swing.JLayeredPane.paint(Unknown Source)
    at javax.swing.JComponent.paintChildren(Unknown Source)
    at javax.swing.JComponent.paintToOffscreen(Unknown Source)
    at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source)
    at javax.swing.RepaintManager$PaintManager.paint(Unknown Source)
    at javax.swing.RepaintManager.paint(Unknown Source)
    at javax.swing.JComponent.paint(Unknown Source)
    at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source)
    at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source)
    at sun.awt.SunGraphicsCallback.runComponents(Unknown Source)
    at java.awt.Container.paint(Unknown Source)
    at java.awt.Window.paint(Unknown Source)
    at javax.swing.RepaintManager$4.run(Unknown Source)
    at javax.swing.RepaintManager$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
    at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source)
    at javax.swing.RepaintManager.access$1200(Unknown Source)
    at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
Ecco la classe creaOggetti come l'ho modificata:

codice:
package oggetto;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


import javax.swing.JFrame;
import javax.swing.JPanel;


@SuppressWarnings("serial")


public class creaOggetti extends JPanel {
  
   public static int h;
   public static int w;
   int X=0,Y=0,W=0, H=0;
   final int MAX_OGGETTI=1;


    Oggetto[] cerchio=null;
    InputStreamReader input = new InputStreamReader(System.in); // Flusso di byte
    BufferedReader tastiera = new BufferedReader(input); // Flusso di caratteri
    
    public void crea(){
        
        // int X=0,Y=0,W=0, H=0;
        cerchio = new Oggetto[MAX_OGGETTI];
        
        for(int i=0; i<MAX_OGGETTI; i++){
            
            try {
                
                System.out.print("Inserisci l'asse X di partenza dell'oggetto -> ");
                X = Integer.parseInt(tastiera.readLine());
                
                System.out.print("Inserisci l'asse Y di partenza dell'oggetto -> ");
                Y=Integer.parseInt(tastiera.readLine());
                
                System.out.print("Inserisci la larghezza dell'oggetto -> ");
                W=Integer.parseInt(tastiera.readLine());
                
                System.out.print("Inserisci l'altezza dell'oggetto -> ");
                H=Integer.parseInt(tastiera.readLine());
                
                cerchio[i]=new Oggetto(cerchio[i],X,Y,W,H);
                
            } catch (NumberFormatException | IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


            
            
        }
    }
    
    public void movimento() {
        for(int i=0;i<MAX_OGGETTI; i++) cerchio[i].sposta(h,w);
    }


    @Override
    public void paintComponent(Graphics g) { //Ho usato come da te suggertio la firma paintComponent
         super.paintComponent(g);
         if(cerchio!=null){
             Graphics2D g2d=(Graphics2D) g;
             for(int i=0;i<MAX_OGGETTI; i++) cerchio[i].disegna(g2d);                
         }
         
}
    
    
    public static void main(String[] args) throws InterruptedException  {
        
    
        
        JFrame frame= new JFrame("Processo");
        frame.setSize(800, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        Rectangle r = frame.getBounds();
        h = r.height;
        w = r.width;
        
        Processo proc0=new Processo();
        Thread p1=new Thread(proc0);
        
        frame.add(proc0.Elemento); //Aggiungo gli oggetti JPanel al FRAME
        frame.setVisible(true);
        
        p1.start(); //Avvio il Thread
    }
}
Riga nella quale segna l'errore:
codice:
 for(int i=0;i<MAX_OGGETTI; i++) cerchio[i].disegna(g2d);
Spero di poter riuscire