IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

[JScrollPane][Canvas] L'image ne s'affiche pas


Sujet :

AWT/Swing Java

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2004
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 282
    Points : 119
    Points
    119
    Par défaut [JScrollPane][Canvas] L'image ne s'affiche pas
    Bonjour,
    J'essaye désespérément d'afficher une image ipeg dans un JScrollPane mais sans succès.
    Pour cela j'utilise la classe suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    class MyCanvas extends Canvas {
      private Image img;
      private int x, y;
     
      public MyCanvas (String myFile) {
        img = getToolkit().getImage ("myFile");
        x = 0; y = 0;
      }
     
      public void paint (Graphics g) {
        g.drawImage (img, x, y, this);
      }
     
      public void setPos (int _x, int _y) {
        x = _x; y = _y;
      }
    }

    Normalement, il me suffit de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
             jsp.add (new MyCanvas (fileName));
              jsp.repaint();
              jsp.updateUI();
    où "jsp" est un JScrollPane, mais il reste gris...
    Ce jsp est lui-même inclus dans une interface graphique avec des JPanels en cascade...

    SVP aidez-moi, merci d'avance !

    [ Modéré par Viena ]
    Ajout balises de code : Pensez aux balises [code], votre message est plus lisible et la lecture plus facile.

    Les Règles du Forum

  2. #2
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Essaie de rajouter du super.paint() dans ta méthode paint().
    Et d'ailleurs, il vaut mieux surcharger la méthode paintComponent() plutôt que paint() (et donc appeler super.paintComponent() )

    Et fait aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    g.drawImage (img, x, y, null);
    plutôt qu'avec "this" en dernier paramètre...

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2004
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 282
    Points : 119
    Points
    119
    Par défaut toujours rien...
    Citation Envoyé par seiryujay
    Essaie de rajouter du super.paint() dans ta méthode paint().
    Et d'ailleurs, il vaut mieux surcharger la méthode paintComponent() plutôt que paint() (et donc appeler super.paintComponent() )

    Et fait aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    g.drawImage (img, x, y, null);
    plutôt qu'avec "this" en dernier paramètre...
    Salut Seryujay,
    J'ai essayé tout ce que tu as écrit plus haut, mais sans résultat...
    Le pire c'est que ce matin j'avais bien l'affichage de mon image et après certains changements plus rien... et j'ai oublié ce que j'ai touché, j'ai perdu l'historique... en tout cas je n'avais pas changé la classe MyCanvas.

    Aurais-tu par hazard un bout de code super simple permettant d'afficher une image ?

  4. #4
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Il ne faut pas appeler JScrollPane.add(tonCanvas);, mais JScrollPane.setViewportView(tonCanvas);

    De plus, Canvas est un composant awt et JScrollPane un composant swing. Il vaudrait mieux que tu remplaces simplement Canvas par JPanel (aucune autre modification nécessaire).

    Et comme l'a dit seirijuray, surcharger paintComponent plutôt que paint (mais bon c'est le petit plus).
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2004
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 282
    Points : 119
    Points
    119
    Par défaut
    Citation Envoyé par xavlours
    Il ne faut pas appeler JScrollPane.add(tonCanvas);, mais JScrollPane.setViewportView(tonCanvas);

    De plus, Canvas est un composant awt et JScrollPane un composant swing. Il vaudrait mieux que tu remplaces simplement Canvas par JPanel (aucune autre modification nécessaire).

    Et comme l'a dit seirijuray, surcharger paintComponent plutôt que paint (mais bon c'est le petit plus).

    Merci à tous les 2 :
    alors après MAJ j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class MyCanvas extends JPanel {
    ...
     
      public MyCanvas (String myFile) {
    ...
      }
     
      public void paintComponent (Graphics g) {
        super.paint(g);
        g.drawImage (img, x, y, null);
      }
    ...
    }
    mais j'obtiens un StackOverFlowError sur le super.paint(g)....
    Sinon j'ai bien ajouté le getViewport()
    mais pas mieux, et même résultat en incluant un JPanel dans le JScrollPane et en ajoutant le canvas dans le JPanel...

    [ Modéré par Viena ]
    Ajout balises de code : Pensez aux balises [code], votre message est plus lisible et la lecture plus facile.

    Les Règles du Forum

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2004
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 282
    Points : 119
    Points
    119
    Par défaut
    Alors juste pour info : j'ai mis une couleur white en foregroud du JScrollPaint, donc à la base c'est blanc.
    Quand j'essaye d'afficher le Canvas dedans, ça passe en gris...
    Ca peut peut-être nous aider à comprendre ce qui se passe ?

  7. #7
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Bon, au cas ou, tu n'utiliserait pas d'autres composants awt (dont le nom ne commence pas par J) ? Sinon, tu peux essayer de construire ton JScrollPane sur le canvas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JScrollPane jsp = new JScrollPane(new MyCanvas(filename));
    Quant à la StackOverflowError, c'est super bizarre. Tu es sûr que c'est à cette ligne ?


    [EDIT] mais non c'est normal : appelle super.paintComponent(g) au lieu de super.paint(g);
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  8. #8
    Membre averti

    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 418
    Points : 328
    Points
    328
    Par défaut
    Salut.

    Je m'étais galéré il y a quelque temps avec un JScrollPane...
    La solution était que rien ne s'affichait car la taille du JScrollPane était nulle.
    En surchargeant la méthode getPreferredSize() du JScrollPane, tout s'est arrangé...
    Tu peux donc essayer un truc genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    JScrollPane monScroll = new JScrollPane(new myCancas(FileName)) {
       public Dimension getPreferredSize() {
           return new Dimension (largeurImage, hauteurImage);
       }
    }
    J'espère avoir été utile.
    A+

  9. #9
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2004
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 282
    Points : 119
    Points
    119
    Par défaut En bonne voie !
    Re-salut,
    Et d'abord merci à ceux qui ont tenté de m'aider. Vous m'avez bien mis sur la voie.

    Voici mes classes actuelles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    class MyCanvas extends JPanel {
      private Image img;
      private int x, y;
     
      public MyCanvas (String myFile) {
        img = getToolkit().getImage (myFile);
        x = 0; y = 0;
      }
     
      public void paint (Graphics g) {
        this.setPreferredSize (new Dimension (300, 500));
        g.drawImage (img, x, y, null);
        paintComponent(g);
        this.validate();
        //this.updateUI();
      }
     
      public void setPos (int _x, int _y) {
        x = _x; y = _y;
      }
    et l'appel à cette classe dans mon interface principale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
              mc = new MyCanvas (fileName);
              jPanelPoster.add(mc, BorderLayout.CENTER);
              mc.setVisible(true);
              mc.paint (jPanelPoster.getGraphics());
              jPanelPoster.validate();
    Comme vous le voyez, j'ai ajouté un JPanel dans le JScrollPane, et c'est dans ce panel que j'ajoute mon image.

    Maintenant il me reste juste un pb de rafraichissement : je dois cliquer deux fois sur mon bouton pour que l'image s'affiche.

    Vous auriez la solution ? je m'embrouille toujours entre les validate, paint, repaint à appliquer...
    D'ailleurs à qui les appliquer ? au ScrollPain ? au Panel, au Canvas ? à la fenêtre principale ?

    Merci d'avance !

  10. #10
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Change l'appel à Toolkit.getToolkit().getImage(...) par un appel à ImageIO.read(...)

    At pour Afficher une image dans un panel il y a plus propre (plus court surtout que ce que tu fais dans ton paint)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    public class MyPanel extends JPanel {
      private Image img;
      private int x,y;
     
      public MyCanvas (String myFile) {
         img = ImageIO.read(new File(myFile));
         x = 0; y = 0;
      }
     
     
      protected void paintComponent(Graphics g) {
         super.paintComponent(g);
         g.drawImage(img, x, y, null);
      }
    }
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  11. #11
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2004
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 282
    Points : 119
    Points
    119
    Par défaut Cool !
    Super, merci Sinok !
    Cette méthode marche très bien !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Image ne s'affichant pas
    Par kariboo dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 14
    Dernier message: 18/03/2024, 10h42
  2. [Prbl] Thread(image ne s'affichant pas avant le thread.sleep
    Par stephane92400 dans le forum Interfaces Graphiques en Java
    Réponses: 4
    Dernier message: 26/06/2006, 11h57
  3. [CSS] background-image ne s'affiche pas
    Par Ghost Warrior dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 25/12/2005, 01h29
  4. [asp] [crystal report] image ne s'affiche pas +impression
    Par mahboub dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 16/12/2005, 11h16
  5. [HTML Workshop] Mes images ne s'affichent pas
    Par lamarre aisha dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 25/10/2005, 13h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo