
Originariamente inviata da
LeleFT
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