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 !