Partage
  • Partager sur Facebook
  • Partager sur Twitter

Constructeur d'image

NullPointerException

    23 novembre 2010 à 12:42:57

    Bonjour,

    Pour faciliter la gestion d'éléments de mon Canvas graphique, j'ai créé un tout bête (pour l'instant) constructeur SvgImage.

    Bien que je ne pense avoir rien oublié, mon code génère une NullPointerException lors du rendu.

    Comme je n'ai rien changé d'autre que mon constructeur et qu'avant cela, mon script ne retournait pas d'erreur, j'imagine qu'il doit en être la cause mais je ne vois pas en quoi.

    Voici le code qui fonctionne mais sans constructeur :

    import java.io.IOException;
    import java.io.InputStream;
    
    import javax.microedition.lcdui.*;
    import javax.microedition.m2g.SVGAnimator;
    import javax.microedition.m2g.SVGEventListener;
    import javax.microedition.m2g.SVGImage;
    import javax.microedition.m2g.ScalableGraphics;
    import javax.microedition.midlet.*;
    
    import org.w3c.dom.*;
    import org.w3c.dom.svg.*;
    
    public class MyApp extends MIDlet{
    	private SvgCanvas canvas;
    	public MyApp(){
    	}
    	public void startApp(){
    		// Création du canevas
    		canvas=new SvgCanvas("logo",this);
    		// Affichage du canevas
    		Display.getDisplay(this).setCurrent(canvas);
    	}
    	public void pauseApp(){
    	}
    	public void destroyApp(boolean unconditional){
    	}
    }
    class SvgCanvas extends Canvas{
    	protected SVGImage svgImage;
    	// Création d'une instance graphique
    	protected ScalableGraphics sg=ScalableGraphics.createInstance();
    	private static String img;
    	private static MIDlet midlet;
        public SvgCanvas(String img,MIDlet midlet){
    		// Affichage du canevas en fullscreen
    		this.setFullScreenMode(true);
    		this.img=img;
    		this.midlet=midlet;
    	}
    	public void paint(Graphics g){
    		// Définition de la qualité du rendu
    		sg.setRenderingQuality(2);
    		// Définition de la couleur du canevas
    		g.setColor(219,238,255);
    		// Définition du background du canevas
    		g.fillRect(0,0,getWidth(),getHeight());
    		// Ajout de l'instance graphique au canevas
    		sg.bindTarget(g);
    		// Création de l'image
    		try{
    			// Récupération de l'image dans le fichier SVG spécifié
    			svgImage=(SVGImage)SVGImage.createImage((InputStream)getClass().getResourceAsStream("/"+img+".svg"),null);
    		}
    		catch(Exception e){
    		}
    		// Définitions des dimensions de l'image
    		svgImage.setViewportWidth(getWidth());
    		svgImage.setViewportHeight(getHeight());
    		// Ajout de l'image au canevas
    		sg.render(0,0,svgImage);
    		// Libération de l'instance graphique
    		sg.releaseTarget();
    	}
    }
    



    Voici mon code qui ne fonctionne pas :

    import java.io.IOException;
    import java.io.InputStream;
     
    import javax.microedition.lcdui.*;
    import javax.microedition.m2g.SVGAnimator;
    import javax.microedition.m2g.SVGEventListener;
    import javax.microedition.m2g.SVGImage;
    import javax.microedition.m2g.ScalableGraphics;
    import javax.microedition.midlet.*;
     
    import org.w3c.dom.*;
    import org.w3c.dom.svg.*;
     
    public class MyApp extends MIDlet{
    	private SvgCanvas canvas;
    	public MyApp(){
    	}
    	public void startApp(){
    		// Création du canevas
    		canvas=new SvgCanvas("logo",this);
    		// Affichage du canevas
    		Display.getDisplay(this).setCurrent(canvas);
    	}
    	public void pauseApp(){
    	}
    	public void destroyApp(boolean unconditional){
    	}
    }
    class SvgCanvas extends Canvas{
    	protected SvgImage svgImage;
    	// Création d'une instance graphique
    	protected ScalableGraphics sg=ScalableGraphics.createInstance();
    	private static String img;
    	private static MIDlet midlet;
        public SvgCanvas(String img,MIDlet midlet){
    		// Affichage du canevas en fullscreen
    		this.setFullScreenMode(true);
    		this.img=img;
    		this.midlet=midlet;
    	}
    	public void paint(Graphics g){
    		// Définition de la qualité du rendu
    		sg.setRenderingQuality(2);
    		// Définition de la couleur du canevas
    		g.setColor(219,238,255);
    		// Définition du background du canevas
    		g.fillRect(0,0,getWidth(),getHeight());
    		// Ajout de l'instance graphique au canevas
    		sg.bindTarget(g);
    		// Création de l'image
    		svgImage=new SvgImage(img);
    		// Définitions des dimensions de l'image
    		svgImage.setViewportWidth(getWidth());
    		svgImage.setViewportHeight(getHeight());
    		// Ajout de l'image au canevas (rendu)
    		sg.render(0,0,svgImage);
    		// Libération de l'instance graphique
    		sg.releaseTarget();
    	}
    }
    class SvgImage extends SVGImage{
    	public SvgImage(String img){
    		try{
    			// Récupération de l'image dans le fichier SVG spécifié
    			this.createImage((InputStream)getClass().getResourceAsStream("/"+img+".svg"),null);
    		}
    		catch(Exception e){
    		}
    	}
    }
    


    Sachant que pour les besoins de mon projet, j'ai absolument besoin de mon constructeur, qui va pas mal s'étoffer, pourriez-vous me dire comment je puis le faire fonctionner, svp?


    EDIT : Petit info importante, le fichier SVG existe bel et bien et son chemin d'accès est correct, inutile donc de vous aventurer dans cette voie. ;)
    • Partager sur Facebook
    • Partager sur Twitter
      23 novembre 2010 à 12:57:42

      salut,

      peut tu nous données la stacktrace complète.
      sa pourra aider.

      bonne chance
      • Partager sur Facebook
      • Partager sur Twitter
        23 novembre 2010 à 13:15:31

        Merci...

        Voilà le message d'erreur généré :

        Using Pisces Renderer (native version)
        java.lang.NullPointerException
        at javax.microedition.m2g.ScalableGraphics.render(+107)
        at SvgCanvas.paint(+92)
        at javax.microedition.lcdui.Canvas.callPaint(+85)
        at javax.microedition.lcdui.Display.repaint(+82)
        at javax.microedition.lcdui.Display.registerNewCurrent(+235)
        at javax.microedition.lcdui.Display.access$700(+6)
        at javax.microedition.lcdui.Display$DisplayAccessor.foregroundNotify(+46)
        at javax.microedition.lcdui.Display$DisplayManagerImpl.notifyWantsForeground(+152)
        at javax.microedition.lcdui.Display$DisplayManagerImpl.access$100(+6)
        at javax.microedition.lcdui.Display.setCurrent(+70)
        at MyApp.startApp(+25)
        at javax.microedition.midlet.MIDletProxy.startApp(+7)
        at com.sun.midp.midlet.Scheduler.schedule(+270)
        at com.sun.midp.main.Main.runLocalClass(+28)
        at com.sun.midp.main.Main.main(+80)


        EDIT : Pour ceux qui voudraient faire du testing, voici un fichier SVG hyper basique :

        <?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
        <svg id="vb" version="1.1" baseProfile="tiny" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="240" height="400" viewBox="0 0 240 400">
        	<rect x="40" y="200" width="160" height="40" rx="10" ry="10" fill="#000" />
        </svg>
        


        N'oubliez pas de le nommer logo.svg ;)
        • Partager sur Facebook
        • Partager sur Twitter
          23 novembre 2010 à 13:56:44

          salut,
          met e.printstacktrace() dans le catch du constructeur du SvgImage on verra déjà mieux si il y a un problème ici.

          il est jamais bon de ne rien faire dans un catch. au pire si l'erreur n'est pas grave mettre une log est toujours utile.
          • Partager sur Facebook
          • Partager sur Twitter
            23 novembre 2010 à 14:04:25

            Ok mais même avec, ça ne change absolument rien, ni au résultat, ni au message d'erreur généré...
            • Partager sur Facebook
            • Partager sur Twitter
              23 novembre 2010 à 14:39:21

              ok dans se cas tu peut être sur que ton erreur ne se produit pas dans ton constructeur. après je ne vois pas vraiment.
              regarde la ligne d'ou vient l'erreur et met un break point avant avec ton debugger et regarde la valeur de tes variables.

              Bonne chance
              • Partager sur Facebook
              • Partager sur Twitter
                23 novembre 2010 à 23:07:23

                Voici ce qu'on m'a conseillé de faire...

                import java.io.*;
                 
                import javax.microedition.lcdui.*;
                import javax.microedition.m2g.SVGAnimator;
                import javax.microedition.m2g.SVGEventListener;
                import javax.microedition.m2g.SVGImage;
                import javax.microedition.m2g.ScalableGraphics;
                import javax.microedition.midlet.*;
                 
                import org.w3c.dom.*;
                import org.w3c.dom.svg.*;
                 
                public class MyApp extends MIDlet{
                	private SvgCanvas canvas;
                	public MyApp(){
                	}
                	public void startApp(){
                		// Création du canevas
                		canvas=new SvgCanvas("logo",this);
                		// Affichage du canevas
                		Display.getDisplay(this).setCurrent(canvas);
                	}
                	public void pauseApp(){
                	}
                	public void destroyApp(boolean unconditional){
                	}
                }
                class SvgCanvas extends Canvas{
                	protected DynamicImage svgImage;
                	// Création d'une instance graphique
                	protected ScalableGraphics sg=ScalableGraphics.createInstance();
                	private static String img;
                	private static MIDlet midlet;
                    public SvgCanvas(String img,MIDlet midlet){
                		// Affichage du canevas en fullscreen
                		this.setFullScreenMode(true);
                		this.img=img;
                		this.midlet=midlet;
                	}
                	public void paint(Graphics g){
                		// Définition de la qualité du rendu
                		sg.setRenderingQuality(2);
                		// Définition de la couleur du canevas
                		g.setColor(219,238,255);
                		// Définition du background du canevas
                		g.fillRect(0,0,getWidth(),getHeight());
                		// Ajout de l'instance graphique au canevas
                		sg.bindTarget(g);
                		// Création de l'image
                		svgImage=DynamicImage(img).getImage();
                		// Définitions des dimensions de l'image
                		svgImage.setViewportWidth(getWidth());
                		svgImage.setViewportHeight(getHeight());
                		// Ajout de l'image au canevas (rendu)
                		sg.render(0,0,svgImage);
                		// Libération de l'instance graphique
                		sg.releaseTarget();
                	}
                }
                class DynamicImage{
                   private SVGImage image;
                   public DynamicImage(String img){
                		try{
                			image=(SVGImage)SVGImage.createImage((InputStream)getClass().getResourceAsStream("/"+img+".svg"),null);
                		}
                		catch(Exception e){}
                   }
                   public SVGImage getImage(){
                       return image;
                   }
                }
                


                Mais ça me retourne que la méthode DynamicImage n'existe pas, comment est-ce possible, svp?

                En gros, ce dont j'ai besoin, c'est de pouvoir récupérer dans mon canevas, une image que j'aurai chargée depuis une classe indépendante de SVGCanvas, afin de pouvoir y ajouter des évènements, la modifier, etc.
                • Partager sur Facebook
                • Partager sur Twitter
                  24 novembre 2010 à 0:43:18

                  C'est normal, tu utilises une méthode comme si elle était statique. Tu dois donc déclarer la méthode statique et tu ne peux pas utiliser de variables d'instance.
                  Il faudrait faire:
                  class DynamicImage{
                     public static SVGImage getImage(String img){
                  	try{
                  		return (SVGImage)SVGImage.createImage((InputStream)getClass().getResourceAsStream("/"+img+".svg"),null);
                  	}
                  	catch(Exception e){}
                  	return null;
                     }
                  }
                  

                  Ensuite, il faudra utiliser la méthode statiquement: svgImage=DynamicImage.getImage(img);
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Constructeur d'image

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown