Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    10

    problema con Immagine in JLabel

    Salve a tutti! Ho appena consegnato per l'università un bel progetto di un gioco. Si tratta di un gioco di ruole fantasy, con anche interfaccia grafica. Sono riuscito a caricare e visualizzare delle immagini riutilizzando del codice che ho trovato sul manuale e effettuando alcune modifiche. Il tutto funziona ma non ho idead del perchè! Infatti se riscrivo lo stesso codice in un altro punto del programma nn mi viene visualizzato niente.

    Ciò che ho fatto è visualizzare una certa immagine in una JLabel (uso Swing).
    Per farlo ho creato una nuova Classe MyLabel che estende JLabel:

    codice:
    import java.awt.*;
    import java.io.File;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    import javax.swing.*;
    
    public class MyLabel extends JLabel {
    
    	Toolkit t;
    	Image pianura, citta, collina;
    	int tipo;
    	Graphics g;
    
    	public MyLabel() {
    
    		init();
    
    	}
    
    	public MyLabel(int tipo) {
    
    		this.tipo = tipo;
    
    	}
    
    	private void init() {
    
    		t = Toolkit.getDefaultToolkit();
    
    		// caricamento immagini
    
    		try {
    			collina = ImageIO.read(new File("img/collina.jpg"));
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		try {
    			citta = ImageIO.read(new File("img/citta.jpg"));
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		try {
    			pianura = ImageIO.read(new File("img/pianura.jpg"));
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    		
    	}
    
    	
    	public void setTipo(int tipo) {
    
    		this.tipo = tipo;
    		
    	}
    
    	public void paintComponent(Graphics g) {
    		super.paintComponents(g);
    
    		setBackground(Color.black);
    		if (tipo == 0)
    			g.drawImage(collina, 0, 0, null);
    		else if (tipo == 1)
    			g.drawImage(citta, 0, 0, null);
    		else if (tipo == 2)
    			g.drawImage(pianura, 0, 0, null);
    		
    	}
    
    	
    }
    poi, nel main, faccio normalmente:

    codice:
    JPanel pannello = new JPanel();
    MyLabel l = new MyLabel();
    pannello.add(l);
    l.setTipo(0);
    E aggiungo il pannello alla finestra. Io ho fatto 2 pannelli, che sono a loro volta contenuti in un altro pannello con BorderLayout. In quello centrale ho messo un array di MyLabel (una specie di mappa) che, a seconda di come viene caricata la mappa, carica casualmente le immagini (uso un numero random da inserire nel setTipo. Tutto funziona alla perfezione, non solo... cambia anke dinamicamente nel caso voglio aggiornare la mappa, semplicemente richiamando setTipo. Se invece aggiungo altri pannelli con altre MyLabel nel BorderLayout WEST o EAST ecc... nn si vede nulla!!!
    Sbaglio qualcosa? Quando e perchè Java dovrbbe non visualizzarmi le immagini?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: problema con Immagine in JLabel

    Originariamente inviato da rickysac
    Per farlo ho creato una nuova Classe MyLabel che estende JLabel:
    Ci sarebbero un po' di cose da farti notare:

    1) Le variabili di istanza sarebbe meglio metterle private.
    2) Non vedo cosa ti serva un Graphics e Toolkit tra le variabili di istanza.
    3) Non vedo perché debba estendere JLabel se poi tanto fai del custom painting ... tanto vale estendere es. JPanel/JComponent.
    4) Se proprio vuoi estendere JLabel, allora al massimo potevi caricare le immagini come ImageIcon e cambiare solamente la proprietà icon (setIcon). Cosa che almeno avrebbe garantito un "preferred size" del componente.
    5) In setTipo() solo assegnare alla variabile di istanza non basta. Non è quello che "scatena" un nuovo paint del componente!! Devi richiedere il repaint().
    6) Il setBackground(Color.black) non è necessario farlo nel paintComponent, puoi farlo nella inizializzazione.

    Originariamente inviato da rickysac
    Se invece aggiungo altri pannelli con altre MyLabel nel BorderLayout WEST o EAST ecc... nn si vede nulla!!!
    Perché in WEST o EAST è importante che il componente abbia un "preferred width" (l'altezza dipende dal contenitore ... non dal componente). E il tuo componente non ha un preferred size.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    10
    Intanto grazie della risposta.

    1) Ovviamente ho riportato riassuntivamente il codice, tutto è private in quello reale
    2) Inizialmente non l'avevo messo, mi dava errore xke nn c'era e l'ho aggiunto.
    3) Avevo pensato ad estendere dei pannelli però mi sembrava eccessivo... ho già altri 10 pannelli circa e la mappa è 7*7 (minimo), avrei avuto circa 100 pannelli in una finestra ed inoltre nn gli avrei utilizzati quasi x nulla nel contesto dei pannelli. Ad ogni modo in un'altra finestra ho risolto così, ma vorrei sapere perchè qui non funziona
    4)avevo provato con ImageIcon ma non ci sono riuscito in nessun modo, tuttavia tuttavia se ha la possibilità di dare la preferred size potrebbe essermi tuli perchè in effetti le immagini me le schiaccia quando cambiano le dimensione di altri componenti.
    5)Tuttavia con l'altro pannello funziona! Non so come, crea l'immagine e la cambia perfino in tempo reale, facendo solamente setTipo(), non ho mai usato paint e repaint. Ad ogni modo ho provato ad inserire le repaint() per il nuovo pannello ma non cambia nulla.
    6) Il setBackground(Color.black) c'è solo perchè ho copiato il codice di quel manuale, a dire il vero non mi serve neanche...

    Per l'ultima cosa... nelle label il comando preferred width non esiste... ho provato preferred size ma nn cambia nulla, d'altra parte per il pannello in cui si vede non ho cambiato ma le dimensione eppure funziona!
    Adesso ho provato a mettere il pannello della mappa dal centro a sinistra e quello che era a sinistra al centro e non si vede più nulla! Dunque solo nel CENTER si vedono le mie immagini, perchè???

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    codice:
    public class MyLabel extends JLabel {
        private ImageIcon[] icone;
        private int tipo;
    
        public MyLabel(int tipo) {
            icone = new ImageIcon[3];
            icone[0] = new ImageIcon("img/collina.jpg");
            icone[1] = new ImageIcon("img/citta.jpg");
            icone[2] = new ImageIcon("img/pianura.jpg");
            setTipo(tipo);
        }
    
        public void setTipo(int tipo) {
            setIcon(icone[tipo]);
            this.tipo = tipo;
        }
    
        public int getTipo() {   // Opzionale ... ma può venire utile
            return tipo;
        }
    }
    Tutto qui.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    10
    Grazie mille, comunque il problema è veramente che non setta la dimensione, dunque vedendola a 0 nel WEST taglia tutto.
    Come faccio a settare la dimensione?

    ho provato così:

    Dimension d = new Dimension();
    d.height = 110;
    d.width = 148;
    setPreferredSize(d);

    nella MyLabel ma non sembra avere effetto!

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    10
    TU SEI UN GENIO AMICO MIO!
    Ho risolto, così si vedono tutte. In effetti così mette già la dimensione esatta...
    Grazie mille mi hai risolto un sacco di problemi!
    Senti posso abusare ancora un attimo della tua conoscenza?
    A destra di tutto questo (nel Border.EAST) ho una label, il cui testo cambia durante l'esecuzione. Poichè il testo fa cambiare la dimensione della Label e questa fa cambiare la dimensione del pannello, il pannello centrale viene schicciato con testi lungo. Come potrei fare in modo che o la label o il pannello non modifichino la propria dimensione?

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    10
    Grazie ai vostri consigli ho finito il programma, tuttavia ora ho un nuovo problema. Io uso eclipse e vorrei esportare il mio programma per mostralo a chiunque possegga un pc e abbia la javac installata. Ho provato ad esportare un runnable jar file, ma una volta ke clicco sul file non accade niente. Provando dal cmd a fare java CrossFire.jar (CrossFire è il nome del programma) mi da un'eccezione riguardante delle classi non trovate. Ho letto su parecchi forum di problemi simili ma capendoci ben poche. Io non devo importare classi esterne, devo lo stesso inserire qualcosa nel class-path? Le mie classi sono divisi in 5 package, ho porvato ad inserire nel calss-path i nome delle cartelle esatte (ad esempio mondo\) ma mi da sempre lo stesso errore!!! Un aiutino please?

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    10
    UP! Vi prego, ho bisogno...

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.