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:
Come è intiubile il metodo privato drawNodes() è quello che rappresenta i nodi.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
Inoltre alcune volte non mi vengono visualizzati i nodi, ma bensì mi viene sollevata un'accesione del tipo:
dove l'istruzione alla riga 84 è la seguente: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.
sarà un problema della memoria della scheda video?codice:g.clearRect(0, 0, this.getWidth(), this.getHeight());

Rispondi quotando