Canvas e BufferedImage

di il
3 risposte

Canvas e BufferedImage

Salve a tutti, stavo facendo alcuni esperimenti con i canvas e le immagini. però riscontro un problema. ho creato una classe che serve a caricare le immagini e un altra che estende la classe Canvas. quando vado ad eseguire non visualizza l'immagine. l'errore avviene nel metodo disegna


Graphics g = this.getGraphics();

il valore è null quindi solleva un eccezione. perchè non recupera la Graphics se la classe estende canvas non ci dovrebbero essere problemi?
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.*;

public class Prova extends Canvas {

	private String path = "redmobmod.png";
	private BufferedImage img; 
	private JFrame jf = new JFrame();
	
	public Prova()
	{
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jf.setSize(500, 500);
		jf.setVisible(true);
		jf.setTitle("TRY DRAW IMAGE");
		
		caricaRisorse();
		disegnaImmagine();
	}
	
	private void caricaRisorse()
	{
		CaricatoreImmagini loader = new CaricatoreImmagini();
		img = loader.caricaRisorsa(path);
	}
	
	private void disegnaImmagine()
	{
		Graphics g = this.getGraphics();
		if(g == null)
		{
			System.out.println("Impossibile Recuperare il Contesto Grafico");
		}
		g.drawImage(img, 500, 500, this);
	}
	
	
	
	public static void main(String[] args) {
		
		new Prova();
		
	}
	
	private class CaricatoreImmagini
	{
		BufferedImage immagine; 
		
		BufferedImage caricaRisorsa(String path)
		{
			
			File f = new File(path);
			if(f.exists())
			{
				try
				{
					this.immagine = ImageIO.read(f);
				}catch(IOException e)
				{
					System.out.println("Errore Caricamento Immagine");
				}
			}
			else
			{
				System.out.println("Impossibile Recuperare la risorsa");
			}
			return this.immagine;
		}
	}
}
Non badate troppo al codice Disordinato :d è fonte di continui cambiamenti visto che non capivo il problema >.<

3 Risposte

  • Re: Canvas e BufferedImage

    Shoto ha scritto:


    quando vado ad eseguire non visualizza l'immagine. l'errore avviene nel metodo disegna

    Graphics g = this.getGraphics();

    il valore è null quindi solleva un eccezione. perchè non recupera la Graphics se la classe estende canvas non ci dovrebbero essere problemi?
    Il Graphics di un componente non è un qualcosa di scontato che hai sempre, in qualunque momento/punto. Il Graphics viene creato dal framework e solo DOPO che il componente diventa "displayable", ovvero dopo che è stato aggiunto in un contenitore e alla fine la finestra che lo contiene è diventata visibile e quindi sono state allocate risorse native.

    Dal javadoc:

    public Graphics getGraphics()

    Creates a graphics context for this component. This method will return null if this component is currently not displayable.

    Inoltre il vero "contesto" di disegno in AWT è il paint(Graphics). Se vuoi disegnare sul Canvas DEVI ridefinire questo metodo.
    Disegnare "al volo" prendendo il Graphics è una tecnica avanzata che si usa quando si voglio realizzare effetti o ottimizzazioni particolari.

    In altre parole: devi ancora chiarirti le idee sul painting nei componenti AWT/Swing.

    Shoto ha scritto:


    Non badate troppo al codice Disordinato
    Sì, è parecchio brutto, come minimo per il fatto che una classe che estende Canvas (quindi solo un "componente") vada a creare un JFrame.
  • Re: Canvas e BufferedImage

    andbin ha scritto:


    Shoto ha scritto:


    quando vado ad eseguire non visualizza l'immagine. l'errore avviene nel metodo disegna

    Graphics g = this.getGraphics();

    il valore è null quindi solleva un eccezione. perchè non recupera la Graphics se la classe estende canvas non ci dovrebbero essere problemi?
    Il Graphics di un componente non è un qualcosa di scontato che hai sempre, in qualunque momento/punto. Il Graphics viene creato dal framework e solo DOPO che il componente diventa "displayable", ovvero dopo che è stato aggiunto in un contenitore e alla fine la finestra che lo contiene è diventata visibile e quindi sono state allocate risorse native.

    Dal javadoc:

    public Graphics getGraphics()

    Creates a graphics context for this component. This method will return null if this component is currently not displayable.

    Inoltre il vero "contesto" di disegno in AWT è il paint(Graphics). Se vuoi disegnare sul Canvas DEVI ridefinire questo metodo.
    Disegnare "al volo" prendendo il Graphics è una tecnica avanzata che si usa quando si voglio realizzare effetti o ottimizzazioni particolari.

    In altre parole: devi ancora chiarirti le idee sul painting nei componenti AWT/Swing.

    Shoto ha scritto:


    Non badate troppo al codice Disordinato
    [Sì, è parecchio brutto, come minimo per il fatto che una classe che estende Canvas (quindi solo un "componente") vada a creare un JFrame.
    Mi riferivo proprio a questo and sapevo che avresti risposto tu e lo notavi. era una prova veloce su una classe diversa per non scombinare tutto il progetto. Sicuramente devo chiarirmi le idee qualche articolo da suggerirmi o codice da leggere?
  • Re: Canvas e BufferedImage

    Shoto ha scritto:


    qualche articolo da suggerirmi o codice da leggere?
    Il tutorial ufficiale Oracle sul custom painting generalmente è sufficiente come base:
    Performing Custom Painting

    Ma è più orientato verso Swing invece che AWT.

    Se vuoi esempi di codice sul custom painting (Swing naturalmente), puoi vedere quelli fatti da me.
Devi accedere o registrarti per scrivere nel forum
3 risposte