Partage
  • Partager sur Facebook
  • Partager sur Twitter

Débutant en interface graphique

je rame dure! pour afficher une image ...

Sujet résolu
    23 mai 2009 à 23:51:17

    Salut à tous!

    je suis en train de faire l'interface graphique de mon programme et je rencontre quelques difficultés ...
    en fait, j'ai 4 onglet avec à l'intérieur de chacun, 2 panel : un qui sert de formulaire et l'autre qui sert d'affichage d'une image.
    cependant, dès la construction de la fenêtre, j'aimerai afficher l'image mais ça plante.
    il y a 1 image par onglet.
    et je e voit pas comment faire, aurais-je oublié quelque chose?
    demain matin, je vous poste la partie du soft problématique, là, j'ai plus le courage à fire de l'interface graphique ...
    mais si vous avez des idées ...
    et j'ai utilisé : un buffer pour lire l'image, un getGraphics pour le panel concerné, puis je fait un cast en graphics 2D et enfin, j'affiche l'image avec drawImage ../ mais => nullpointerexecption (il trouve l'image mais l'affiche pas!)
    merci à vous!
    • Partager sur Facebook
    • Partager sur Twitter
      24 mai 2009 à 0:08:56

      'soir

      NullPointeurException signifie que tu a une variable qui a pour valeur null... surement ton getGraphics()

      vérifie que tu fais getGraphics() après que ton panel ait été ajouté à son panel, et que celui si ait été ajouté, etc jusqu'à la JFrame, qui elle va fournir le Graphics a tous les composants enfants.
      <EDIT>
      regarde le code exemple ici : http://www.siteduzero.com/forum-83-404 [...] html#r3734255 (en bas de mon message)
      </EDIT>

      Sinon utilise plutôt un JLabel avec une icône dedans c'est plus simple que d'afficher ton image que de faire getGraphics et tout et tout.


      • Partager sur Facebook
      • Partager sur Twitter
        24 mai 2009 à 2:26:15

        Bonsoir,

        Oui c'est une solution, mais comme l'a dit quarante-sept, il y a plus simple. Mais essaye avant tout de nous montrer les lignes qui provoquent le NullPointerException. :)

        • Partager sur Facebook
        • Partager sur Twitter
          24 mai 2009 à 10:55:04

          voila le code que j'utilise :

          celui qui récupère l'image :
          private static BufferedImage imageRect = null;
          	static {
          		try {
          			// lecture des images
          			imageRect = ImageIO.read(new File("./src/images/rectangulaire.jpg"));
          		} catch (IOException e) {
          			e.printStackTrace();
          		}
          	}
          


          celui qui affiche l'image :
          public void afficheRect() {
          		Graphics2D g = (Graphics2D) this.imgRect
          		.getGraphics();
          		g.drawImage(imageRect, null, 0, 0);
          	}
          


          le nullpointerxeception arrive au niveau g.drawImage ...
          donc ça ressemble bien à ce que quarante sept dit

          et la méthode d'affichage est utilisée dans une méthode initGui() :
          import com.jgoodies.forms.layout.FormLayout;
          import java.awt.BorderLayout;
          import java.awt.Graphics2D;
          import java.awt.GridLayout;
          import java.awt.image.BufferedImage;
          import java.io.File;
          import java.io.IOException;
          
          import javax.imageio.ImageIO;
          import javax.swing.ImageIcon;
          import javax.swing.JPanel;
          import javax.swing.JTabbedPane;
          
          import javax.swing.WindowConstants;
          import javax.swing.SwingUtilities;
          
          /**
           * This code was edited or generated using CloudGarden's Jigloo SWT/Swing GUI
           * Builder, which is free for non-commercial use. If Jigloo is being used
           * commercially (ie, by a corporation, company or business for any purpose
           * whatever) then you should purchase a license for each developer using Jigloo.
           * Please visit www.cloudgarden.com for details. Use of Jigloo implies
           * acceptance of these licensing terms. A COMMERCIAL LICENSE HAS NOT BEEN
           * PURCHASED FOR THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED LEGALLY FOR
           * ANY CORPORATE OR COMMERCIAL PURPOSE.
           */
          public class StabNavG extends javax.swing.JFrame {
          
          	{
          		// Set Look & Feel
          		try {
          			javax.swing.UIManager.setLookAndFeel(javax.swing.UIManager
          					.getSystemLookAndFeelClassName());
          		} catch (Exception e) {
          			e.printStackTrace();
          		}
          	}
          
          	private JPanel panneauNord;
          	private JPanel imgRect;
          	private JPanel formRect;
          	private JPanel affichageCoque;
          	private JPanel panneauCourbe;
          	private JPanel panneauCoque;
          	private JPanel ongletImp;
          	private JTabbedPane ongletElli;
          	private JPanel ongletTri;
          	private JPanel ongletRect;
          	private JTabbedPane ongletsCoque;
          	private JPanel panneauSud;
          
          	private static BufferedImage imageRect = null;
          	static {
          		try {
          			// lecture des images
          			imageRect = ImageIO.read(new File("./src/images/rectangulaire.jpg"));
          		} catch (IOException e) {
          			e.printStackTrace();
          		}
          	}
          	
          	public void afficheRect() {
          		Graphics2D g = (Graphics2D) this.imgRect
          		.getGraphics();
          		g.drawImage(imageRect, null, 0, 0);
          	}
          
          	/**
          	 * Auto-generated main method to display this JFrame
          	 */
          	public static void main(String[] args) {
          		SwingUtilities.invokeLater(new Runnable() {
          			public void run() {
          				StabNavG inst = new StabNavG();
          				inst.setLocationRelativeTo(null);
          				inst.setVisible(true);
          			}
          		});
          	}
          
          	public StabNavG() {
          		super();
          		initGUI();
          	}
          
          	private void initGUI() {
          		try {
          			setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
          			this.setFont(new java.awt.Font("Garamond", 0, 10));
          			this.setTitle("StabNav - Graphical view");
          			this.setIconImage(new ImageIcon(getClass().getClassLoader()
          					.getResource("images/ico.png")).getImage());
          			{
          				panneauNord = new JPanel();
          				GridLayout panneauNordLayout = new GridLayout(1, 2);
          				panneauNordLayout.setColumns(2);
          				panneauNordLayout.setHgap(5);
          				panneauNordLayout.setVgap(5);
          				getContentPane().add(panneauNord, BorderLayout.NORTH);
          				panneauNord.setLayout(panneauNordLayout);
          				panneauNord.setPreferredSize(new java.awt.Dimension(392, 177));
          				{
          					ongletsCoque = new JTabbedPane();
          					panneauNord.add(ongletsCoque);
          					ongletsCoque.setPreferredSize(new java.awt.Dimension(392,
          							102));
          					{
          						ongletRect = new JPanel();
          						GridLayout ongletRectLayout = new GridLayout(1, 2);
          						ongletRectLayout.setColumns(2);
          						ongletRectLayout.setHgap(5);
          						ongletRectLayout.setVgap(5);
          						ongletsCoque.addTab("Rectangulaire", null, ongletRect,
          								null);
          						ongletRect.setLayout(ongletRectLayout);
          						{
          							formRect = new JPanel();
          							FormLayout formRectLayout = new FormLayout(
          									"max(p;5dlu), max(p;5dlu), max(p;5dlu), max(p;5dlu)",
          									"max(p;5dlu), max(p;5dlu), max(p;5dlu), max(p;5dlu)");
          							ongletRect.add(formRect);
          							formRect.setLayout(formRectLayout);
          						}
          						{
          							imgRect = new JPanel();
          							ongletRect.add(imgRect);
          							afficheRect();
          						}
          					}
          					{
          						ongletTri = new JPanel();
          						GridLayout ongletTriLayout = new GridLayout(1, 2);
          						ongletTriLayout.setColumns(2);
          						ongletTriLayout.setHgap(5);
          						ongletTriLayout.setVgap(5);
          						ongletsCoque.addTab("Triangulaire", null, ongletTri,
          								null);
          						ongletTri.setLayout(ongletTriLayout);
          					}
          					{
          						ongletElli = new JTabbedPane();
          						ongletsCoque.addTab("Elliptique", null, ongletElli,
          								null);
          					}
          					{
          						ongletImp = new JPanel();
          						GridLayout ongletImpLayout = new GridLayout(1, 2);
          						ongletImpLayout.setColumns(2);
          						ongletImpLayout.setHgap(5);
          						ongletImpLayout.setVgap(5);
          						ongletImp.setLayout(ongletImpLayout);
          						ongletsCoque.addTab("Importée", null, ongletImp, null);
          					}
          				}
          				{
          					affichageCoque = new JPanel();
          					panneauNord.add(affichageCoque);
          				}
          			}
          			{
          				panneauSud = new JPanel();
          				GridLayout panneauSudLayout = new GridLayout(1, 2);
          				panneauSudLayout.setColumns(2);
          				panneauSudLayout.setHgap(5);
          				panneauSudLayout.setVgap(5);
          				panneauSud.setLayout(panneauSudLayout);
          				getContentPane().add(panneauSud, BorderLayout.SOUTH);
          				panneauSud.setPreferredSize(new java.awt.Dimension(392, 118));
          				{
          					panneauCourbe = new JPanel();
          					panneauSud.add(panneauCourbe);
          				}
          				{
          					panneauCoque = new JPanel();
          					panneauSud.add(panneauCoque);
          				}
          			}
          			pack();
          			setSize(400, 300);
          		} catch (Exception e) {
          			e.printStackTrace();
          		}
          	}
          
          }
          


          merci à vous!
          • Partager sur Facebook
          • Partager sur Twitter
            24 mai 2009 à 11:03:03

            Euh il y a quelque chose de pas logique, tu récupère le contexte graphique de ton image et ensuite tu dessine l'image sur son propre contexte graphique, ne serais ce pas sur le JPanel que tu dois tracer l'image et donc le contexte graphique du JPanel que tu dois récupérer ?
            Et comme le dis quarante-sept il faut que tu ajoute ton JPanel soit ajouté à ta fenêtre avant d'appeler afficheRect.

            Ce code ci marche en tout cas chez moi :
            public void showLoginPage () {
            	LoginPage lp = LoginPage.createConnexionPage(this);		
            	setContentPane(lp);	
            	setVisible (true);
            	lp.drawLoginImage();
            }
            


            Voilà le code qui ajoute mon panneau à la fenêtre et qui dessine l'image sur mon panneau.

            public void drawLoginImage () {
            	bufferImage = createImage (getWidth(), getHeight ());
            	bufferGraphique = bufferImage.getGraphics();
            	bufferGraphique.drawImage(loginbgimage, 0, 0,getWidth(), getHeight(), this);	
            	repaint ();
            }
            	
            public void paintComponent (Graphics g) {
            	g.drawImage(bufferImage, 0, 0, this);
            }
            


            Et voici le code dans ma classe qui hérite de JPanel donc ma classe LoginPage qui trace l'image.
            j'ai utilisé createImage mais dans ton cas ça revient au même si tu la lis avec un fichier.
            J'ai du faire le setContentPane et le setVisible avant de tracer l'image sinon, ça ne marche pas!

            • Partager sur Facebook
            • Partager sur Twitter
              24 mai 2009 à 11:11:29

              désolé, je comprend pas trop ce que tu dis .. notamment quand tu parles de "contexte graphique"

              et n'aurais-je pas oublié un repaint()?

              ma méthode afficheRect ne fait que : réupérer le l'obket graphics du panneau sur lequel je veux dessiner
              puis dessine l'image sur ce panneau

              et moi j'ai pas classe supplémentaire hérité de jpanel ou autre, je n'en ai pas besoins pour le moment!

              merci à vous!
              re-édit : après débuggage : c'est bien le getGraphics() qui vaut null donc que faire? quand dois afficher mon image?
              • Partager sur Facebook
              • Partager sur Twitter
                24 mai 2009 à 11:17:19

                juste comme ça, pourquoi tu n'utilise pas ImageIcon ?
                • Partager sur Facebook
                • Partager sur Twitter
                  24 mai 2009 à 11:19:37

                  comment ça?
                  je ne connais pas imageIcon désolé

                  en fait, l'image que je veux afficher est comment est paramétrée la coque choisie
                  • Partager sur Facebook
                  • Partager sur Twitter
                    24 mai 2009 à 11:23:59

                    ImageIcon c'est simple à utilisé, tu la crée en lui passant ton image en paramètre :

                    ImageIcon icone = new ImageIcon(imageRect);
                    

                    Ensuite pour la mettre sur ton composant utilise la méthode widget.setIcon(icone)

                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 mai 2009 à 11:30:50

                      c'est bon, j'ai réussi ...
                      j'ai redéfinit la méthode paint et dedans, j'ai mis mon appel à la méthode : ça fonctionne! enfin!

                      donc merci à vous de m'avoir aider, au moins, je savais ou chercher!
                      • Partager sur Facebook
                      • Partager sur Twitter
                        24 mai 2009 à 11:31:09

                        plutot que de faire
                        imgRect = new JPanel();
                        ongletRect.add(imgRect);
                        afficheRect();
                        

                        qui d'ailleurs pose un problème : afficherRect() dessine dans la JFrame, et pas dans imageRect

                        tu peux faire
                        ImageIcon i = new ImageIcon(imageRect);
                        JLabel l = new JLabel(i);
                        ongletRect.add(l);
                        
                        
                        // si tu change d'image
                        i.setImage(nouvelleImage);
                        


                        EDIT: grillé ...
                        • Partager sur Facebook
                        • Partager sur Twitter
                          24 mai 2009 à 11:35:03

                          Ha oui, juste, si on ne redéfinis la méthode paint ça ne fonctionne pas.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            24 mai 2009 à 12:06:58

                            merci à tous, c'est bon, j'ai compris comment faire!
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Débutant en interface graphique

                            × 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