Salve. Non riesco a capire il motivo dell'errore che ho messo come titolo al thread.
Devo caricare un ImageIcon come sfondo a delle JLabel ogni volta che l'utente tira il suo dado,
però in un certo punto del codice ottengo nullPointerException.
Posto la parte di codice relativa alla gestione di questa cosa:
Dado
Nella partita..codice:public class Dado { private int[] valori; private int valore; public Dado() { valori = new int[6]; valori[0] = 1; valori[1] = 2; valori[2] = 3; valori[3] = 4; valori[4] = 5; valori[5] = 6; } public String getValoreStr() { switch(valore) { case 1: return "uno"; case 2: return "due"; case 3: return "tre"; case 4: return "quattro"; case 5: return "cinque"; case 6: return "sei"; default: return "-"; } } public int getNumeroCasuale() { int indice = (int) (Math.random()*6); valore = valori[indice]; return valori[indice]; } public String getUrlImage() { String url = "images/" + getValoreStr() + ".png"; return url; } }
Nella griglia, che osserva la Partitacodice://E' il turno del computer if (turno == 0) { try { //Il computer attende 500 millisecondi prima di giocare Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } int risultato = dado.getNumeroCasuale(); System.out.println("Il computer ha ottenuto " + risultato); giocatoreA.setGiocata(risultato); setChanged(); Messaggio m = new Messaggio(); String text = buildMessage(1); m.setText(text); m.setX(x); m.setY(y); m.setUrlDado(dado.getUrlImage()); notifyObservers(m); turno = 1; x++; i++; } // E' il turno dell'utente if (turno == 1) { while (userHavePlayed == false) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } userHavePlayed = false; setChanged(); int risultato = dado.getNumeroCasuale(); System.out.println("Hai ottenuto " + risultato); giocatoreB.setGiocata(risultato); Messaggio m = new Messaggio(); String text = buildMessage(2); m.setText(text); m.setX(x); m.setY(y); m.setUrlDado(dado.getUrlImage()); notifyObservers(m); turno = 0; x++; i++; }
E' qui che ho localizzato il nullPointerException, che non avviene immediatamente. Per i primi due tiri le facce dei dadi compaiono.
Messaggiocodice:public void update(Observable obs, Object obj) { Messaggio m = (Messaggio) obj; int x = m.getX(); // indice colonna int y = m.getY(); // indice riga //Ottengo l'immagine relativa al dado (dopo un po, nullPointerException!) String pathDado = m.getUrlDado(); System.out.println("Path dado: " + pathDado); Image dado = Toolkit.getDefaultToolkit().createImage(pathDado); ImageIcon iconDado = new ImageIcon(dado); labels[y][x].setOpaque(true); labels[y][x].setIcon(iconDado); }
Ho fatto una prova. Nel metodo update() di messaggio ho provato a impostare solo il colore di sfondo delle JLabel, e funziona perfettamente. Nel frattempo ho messo delle stampecodice:public class Messaggio { private String text; private int x; private int y; private String urlDado; public Messaggio() { x = 0; y = 0; } public void setUrlDado(String url) { urlDado = url; } public String getUrlDado() { return urlDado; } public String toString() { return text; } public void setText(String t) { text = t; } public void setX(int x) { this.x = x; } public void setY(int y) { this.y = y; } public int getX() { return x; } public int getY() { return y; } }
in Partita per vedere se stampa il path corretto di ogni immagine relativa al dado giocato. E avviene correttamente! Nella Partita dunque il path viene rilevato ed impostato correttamente nel messaggio. Poi boh..

Rispondi quotando

