Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Uncaught error fetching image

    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

    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 partita..

    codice:
    //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++;
    			}
    Nella griglia, che osserva la Partita
    E' qui che ho localizzato il nullPointerException, che non avviene immediatamente. Per i primi due tiri le facce dei dadi compaiono.

    codice:
    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);
    	}
    Messaggio

    codice:
    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;
    	}
    }
    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 stampe
    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..

  2. #2
    c'è qualche oggetto che va a null o non inizializzato correttamente....
    fai un debugging dell'applicazione...solo così puoi capire cosa effettivamente fallisce...può essere anche un problema dell'immagine non presente quando vai a fare
    codice:
    ImageIcon iconDado = new ImageIcon(dado);
    forse perché manca il nome...le cause possono essere molteplici.

    Fai debug vedi xche va in eccezione a quel punto avrai già la soluzione..
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  3. #3
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Premessa: non c'entra nulla col tuo problema

    Mi spieghi il senso di avere una classe Dado fatta in questo modo?
    In particolare, cosa server avere un array di 6 elementi [1, 6], generare un numero [0, 5] e usarlo come indice per andare a recuperare il valore dall'array?

    Usa la classe java.util.Random:

    codice:
    Random randomGenerator = new Random();
    int randomValue = randomGenerator.nextInt(6) + 1;
    Se proprio vuoi tenere l'array, scrivilo in modo furbo
    codice:
    valori = new int[] {1, 2, 3, 4, 5, 6};
    Inoltre puoi evitare lo switch usando un altro array:

    codice:
    private String[] valoriAsString = new String[] {"uno", "due", "tre", "quattro", "cinque", "sei"};
    
    public String getValoreAsString() {
        return valoriAsString[posizione];
    }
    Poi:

    codice:
    public String getUrlImage() {
        String url = "images/" + getValoreStr() + ".png";
        return url;
    }
    è bruttino, puoi accorciare:

    codice:
    public String getUrlImage() {
        return String.format("images/%s/.png", getValoreStr());
    }
    my 2 cents
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  4. #4
    Ripeto, durante la partita pare che il path delle immagini viene correttamente stampato. Quindi boh. Comunque grazie dei consigli, proverò a controllare meglio

  5. #5
    Aggiornamento.

    Ho risolto. Era un problema di logica. Siccome notifico un nuovo messaggio anche quando i giocatori non hanno effettivamente giocato il dado, ottenevo null. Ho aggiunto una variabile booleana di controllo in Messaggio, così l'update della Griglia avviene solo quando dovuto.

  6. #6
    Scusate il triplo post, ma a quanto pare c'è un tempo limite per modificare i messaggi. Comunque meglio che aprire una nuova discussione!

    Sto uscendo matto con un altro dettaglio. Per come caricavo prima le immagini, una volta creato il jar, esse non venivano visualizzate. Ho risolto inserendo una cartella "images" nella directory "src" e usando questo codice:

    codice:
    ClassLoader cl = this.getClass().getClassLoader(); 
    			ImageIcon iconDado = new ImageIcon(cl.getResource(pathDado));
    Ora, per lo sfondo del JPanel stesso però non so come fare.
    paintComponent non vuole ImageIcon! Come posso risolvere? Senza contare che
    usavo anche un mediaTracker per il caricamento dello sfondo, e anche lui vuole un Image...

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Javino89
    Per come caricavo prima le immagini, una volta creato il jar, esse non venivano visualizzate.
    Perché quello che usavi non era un url ma semplicemente un pathname "relativo" sul file-system e quindi era dipendente dalla directory corrente.

    Originariamente inviato da Javino89
    Ho risolto inserendo una cartella "images" nella directory "src" e usando questo codice:

    codice:
    ClassLoader cl = this.getClass().getClassLoader(); 
    			ImageIcon iconDado = new ImageIcon(cl.getResource(pathDado));
    Generalmente basta NomeUnaTuaClasse.class.getResource(....)
    Se la specifica a getResource è "relativa" (non inizia con '/' ), la risorsa viene cercata relativamente al package di NomeUnaTuaClasse. Questo spesso è molto utile.

    Non centra più la directory "corrente", le risorse vengono cercate lungo il classpath.

    Originariamente inviato da Javino89
    paintComponent non vuole ImageIcon!
    Se hai già un pannello di "sfondo" su cui puoi disegnare nel suo paintComponent, sappi che ImageIcon contiene banalmente un Image. E puoi estrarlo.

    Originariamente inviato da Javino89
    usavo anche un mediaTracker per il caricamento dello sfondo
    MediaTracker serve per attendere il completamento del caricamento. Ma serve solo raramente.
    Il Toolkit (ImageIcon usa il Toolkit per il caricamento), carica la immagine in modo asincrono e se passi un ImageIcon ad es. un JLabel o JButton, essi sono capaci di renderizzare la immagine in modo "progressivo".

    Insomma, in questi scenari non c'è bisogno di "attendere", tecnicamente. Se tu vuoi attendere per poter vedere solo immagini già complete, ovviamente ok.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Risolto, grazie. Non sapevo di poter estrarre un'Image da un ImageIcon
    Programmo da schifo ma alla fine sono riuscito a farlo questo benedetto programmino.. ._.
    Pian piano cercherò di pulire il codice..

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.