Eccomi di nuovo con un altro problema...innanzitutto volevo ringraziare andbin per la risposta precisa e ovviamente corretta...ho letto il link sul meccanismo del painting ed ho capito un pò meglio come funziona...inoltre ovviamente il bordo è una proprietà che va impostata una volta sola
... ora modificando leggermente la classe precedente ho creato questa:
codice:
public class Casella extends JPanel{
private boolean occupata;
private int i;
private int j;
private int numero = -1;
public Casella(int i, int j){
this.i = i;
this.j = j;
if(i == 0 || i == Commons.NUM_RIGHE - 1){ setBorder(BorderFactory.createLineBorder(Color.black));
}
}
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
ArrayList<Scia> scie = Campo.getScie();
for(int i=0;i<scie.size();i++){
Scia tmp = scie.get(i);
if(tmp.getX() == this.i && tmp.getY() == this.j){
//g2d.drawImage(tmp.getImage(),this.getWidth()/4,this.getHeight()/4,this.getWidth() / 2,this.getHeight() / 2,null);
//g2d.drawLine(this.getWidth() /2, 0, this.getWidth() /2, this.getHeight());
if(tmp.getVerso() == Verso.SOPRA){ g2d.setColor(Color.BLUE);
g2d.drawLine(this.getWidth() /2, 0, this.getWidth() /2, this.getHeight() / 2);
}
else if(tmp.getVerso() == Verso.SOTTO){ g2d.setColor(Color.RED);
g2d.drawLine(this.getWidth() /2 , this.getHeight() /2 ,this.getWidth() / 2 , this.getHeight() );
}
else if(tmp.getVerso() == Verso.DESTRA){ if(tmp.isSciaPari()) g2d.setColor(Color.BLUE); else g2d.setColor(Color.RED); g2d.drawLine(this.getWidth() / 2 , this.getHeight() / 2 , this.getWidth(), this.getHeight() / 2);
}
else if(tmp.getVerso() == Verso.SINISTRA){ if(tmp.isSciaPari()) g2d.setColor(Color.BLUE);
else
g2d.setColor(Color.RED);
g2d.drawLine(this.getWidth() / 2, this.getHeight() / 2, 0 , this.getHeight() / 2);
}
}
}
}//altri metodi get & set
}
tuttavia a volte capita che (soprattutto mandando in esecuzione contemporaneamente più volte lo stesso programma) venga lanciata una eccezione di questo tipo :
codice:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at Casella.paintComponent(Casella.java:33) 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.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._paintImmediately(Unknown Source) at javax.swing.JComponent.paintImmediately(Unknown Source) at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source) at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source) at javax.swing.RepaintManager.seqPaintDirtyRegions(Unknown Source) at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source) at java.awt.event.InvocationEvent.dispatch(Unknown Source) at java.awt.EventQueue.dispatchEventImpl(Unknown Source) at java.awt.EventQueue.access$000(Unknown Source) at java.awt.EventQueue$1.run(Unknown Source) at java.awt.EventQueue$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.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)
ora a quanto ho capito dovrebbe essere un problema dovuto al fatto che il thread EDT esegue a volte alcuni metodi in un ordine tale che alcuni oggetti sui quali si va ad operare ancora non sono stati creati, da cui la NullPointerException...facendo un semplice controllo (oggetto!=null in pratica) si possono "saltare" una o più chiamate al paintComponent fino a quando gli oggetti necessari non siano stati effettivamente creati...ora in questo caso non riesco a capire quale sia l'oggetto nullo. L'eccezione è lanciata a questa riga :
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Casella.paintComponent(Casella.java:33)
ovvero
if(tmp.getX() == this.i && tmp.getY() == this.j){...}
ma cos'è nulla ? la casella ? E come risolvo, mettendo all'inizio di paintComponent un if(this==null) return; ???
Grazie in anticipo e scusate per il post lunghissimo !