Sto cercando di realizzare un applicativo in Java che mi simuli il movimento libero di una sequenza di nodi all'interno di un'area limitata. Tale movimento ovviamente è caratterizzato da un tempo minimo e massimo di pausa ed una velocità minima e massima di movimento.
Ho realizzato il movimento di ogni singolo nodo con un Thread, però quando l'applicazione è in esecuzione, si ha un refresh ritardato del video, cioè i punti (che rappresentano i nodi) si muovono ma all'interno dell'area compaiono delle righe bianche orizzontali che attraversano l'intero pannello. Sotto riporto il codice:
codice:
class MRASimulationWindowPanel extends JPanel implements Runnable{
//altezza, lunghezza
private int alt, lun;
//nodi
private RWMHost[] nodes;
//area di simulazione
SimulationArena arena;
private boolean isRunning = false;
private boolean drawnode;
private boolean idnodo = true;
/**
* Costruttore per un MRASimulationWindowPanel.
* @param l di tipo int, rappresenta la lunghezza dell'area di lavoro.
* @param a di tipo int, rappresenta l'altezza dell'area di lavoro.
* @param ns di tipo RWMHost[], rappresenta la lista dei nodi.
*/
public MRASimulationWindowPanel(int l, int a, RWMHost[] ns){
nodes = ns;
alt=a;
lun=l;
drawnode = true;
//creo l'area di simulazione
arena = new SimulationArena((alt-100), (lun-100));
//elimino potenziali vecchi nodi
arena.removeAllNodes();
//inserisco i nuovi nodi
arena.addNodes(nodes);
//avvio la simulazione per 10 sec
//arena.startSimulation(0);
if(!isRunning){
isRunning = true;
//Start
Thread th = new Thread(this);
th.start();
}//if
//fermo la simulazione
//arena.stopSimulation();
}//MRASimulationWindowPanel
private void drawNodes(){
if(drawnode){
//Prendo il contesto grafico
Graphics g = this.getGraphics();
//Grandezza del pannello
int maxX = this.getWidth();
int maxY = this.getHeight();
//Ripulisco il panel
g.clearRect(0, 0, this.getWidth(), this.getHeight());
g.fillRect(2,2,maxX-4,maxY-4);
//Disegno i nodi
for(int i = 0 ; i < nodes.length ; i ++){
//Posizione e range
int xpos = (int)nodes[i].getXPos();
int ypos = (int)nodes[i].getYPos();
//int rpos = (int)nodes[i].getR();
String lab = "";
if(idnodo)
lab += String.valueOf((nodes[i].getId()+1));
g.setColor(Color.GREEN);
//punto rappresentante il nodo
g.drawOval(xpos + 2, maxY - ypos - 4, 4, 4);
//g.setColor(Color.BLUE);
//disegna il raggio d'azione
//g.drawOval((xpos-rpos), (ypos-rpos), (2*rpos),(2*rpos));
g.setColor(Color.YELLOW);
//Id del nodo
g.drawString(lab, xpos + 4 , maxY - ypos - 4);
}//for
}//if
}//drawNodes
public void run() {
arena.startSimulation(0);
while(isRunning){
drawNodes();
}//while
}//run
}//MRASimulationWindowPanel
Come è intiubile il metodo privato drawNodes() è quello che rappresenta i nodi.
Inoltre alcune volte non mi vengono visualizzati i nodi, ma bensì mi viene sollevata un'accesione del tipo:
codice:
C:\Programmi\Java\jdk1.5.0_09\bin\javaw.exe -classpath "C:\Documents and Settings\Giuseppe\Documenti\Java Source" it.specchio.mra.MRASimulationWindowTest
Exception in thread "Thread-2" java.lang.NullPointerException
at it.specchio.mra.MRASimulationWindowPanel.drawNodes(MRASimulationWindowPanel.java:84)
at it.specchio.mra.MRASimulationWindowPanel.run(MRASimulationWindowPanel.java:123)
at java.lang.Thread.run(Thread.java:595)
Process MRASimulationWindowTest terminated.
dove l'istruzione alla riga 84 è la seguente:
codice:
g.clearRect(0, 0, this.getWidth(), this.getHeight());
sarà un problema della memoria della scheda video?