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

Interfaces Graphiques en Java Discussion :

Dessiner une image à partir d'un composant


Sujet :

Interfaces Graphiques en Java

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut Dessiner une image à partir d'un composant
    Bonjour,
    Je possede une application (donc une fenêtre principale) composé de plusieurs composants de classe A (étendant JPanel).
    Je veux pouvoir ouvrir une JDialog par desus qui contient dans un de ces panel l'image d'un des composants A.

    Pour cela j'ai mis une méthode qui renvoie l'image de mon composant dans ma classe A :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public Image getImage() { 
        int width = getWidth(); 
        int height = getHeight(); 
        BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB); 
        Graphics2D g = image.createGraphics(); 
        paintAll(g); 
        g.dispose(); 
        Image image2 = Toolkit.getDefaultToolkit().createImage(image.getSource()); 
        return image2; 
      }
    Ensuite j'ajoute cette image au panel de ma JDialog :
    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
    private JPanel getGraphPanel() { 
        if (graphPanel == null) { 
          graphPanel = new JPanel(); 
          graphPanel.setFont(ParameterUI.PAC7000_FONT); 
          graphPanel.setLayout(new GridBagLayout()); 
          GridBagConstraints gridBagConstraints6 = new GridBagConstraints(); 
          gridBagConstraints6.fill = java.awt.GridBagConstraints.BOTH; 
          gridBagConstraints6.weightx = 1.0; 
          gridBagConstraints6.weighty = 1.0; 
          graph.setRectangle(graphPanel.getBounds()); 
        graphImage = new GraphImage(graph.getImage()); 
          graphPanel.add(graphImage, gridBagConstraints6); 
          graphPanel.setPreferredSize(new Dimension(210, 250)); 
        } 
        return graphPanel; 
      }
    et graphImage étant mon panel affichant l'image :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
      private class GraphImage extends JPanel {
     
        private Image image;
        public GraphImage(Image image) {
          this.image = image;
        }
     
        protected void paintComponent(Graphics g) {
          super.paintComponent(g);
          Graphics2D graphics2D = (Graphics2D) g;
          graphics2D.drawImage(image, 0, 0, image.getWidth(null), image.getHeight(null),null);
        }
      }
    Malheurseusement rien ne s'affiche, je vois juste les bord du panel de la JDialog, pourtant l'image possede une hauteur et une longueur qui semble cohérent.
    Si quelqu'un voit d'où vien l'erreur, cela pourrait m'aider, merci d'avance.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    up

  3. #3
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Il faut que ton composant soit "realized". Tu peux le faire en affichant le composant ou en le packant dans une fenetre.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    j'ai pas trés bien compris mais a priori mon composant est affiché !!

  5. #5
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Ok compris. Vire ca :

    Image image2 = Toolkit.getDefaultToolkit().createImage(image.getSource());
    return image2;

    Et mets juste :

    return image;

    Une BufferedImage implemente l'interface Image donc ca marchera.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    avant c'est ce que j'avais mis, ca ne marchait pas non plus, j'ai comme meme réessayé mais cela ne marche pas.
    le résultat est le même je vois le bord de mon panel (qui doit être celui de l'image car mon panel n'est pas censé avoir de bord,
    par cuiriosité j'ai rajouté une bordure, on l'a voit bien sur 1/2cm et à l'intérieur on voit le haut d'une bordure :
    _________________________________
    |........................................................|

    (les petits points pour c'est pour créer l'espace...)

    pourtant dans mon constucteur ou j'affiche mon image l'image est bien de la largeur et hauteur désiré (410,310)...
    Mon paintCOmponent est peut etre mauvais...

  7. #7
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Quand tu appelles getImage(), tu as deja fait un appel a pack() ou setVisible(true) ?

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    euh, pas forcémément, en fait mon composant est affiché dans la fenêtre principale,
    la JDialog s'initialise et c'est elle qui fait le getImage
    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
    private JPanel getGraphPanel() {
        if (graphPanel == null) {
          graphPanel = new JPanel();
          graphPanel.setFont(ParameterUI.PAC7000_FONT);
          graphPanel.setLayout(new GridBagLayout());
          GridBagConstraints gridBagConstraints6 = new GridBagConstraints();
          gridBagConstraints6.fill = java.awt.GridBagConstraints.BOTH;
          gridBagConstraints6.weightx = 1.0;
          gridBagConstraints6.weighty = 1.0;
          // Création de l'image du graph.
          graphImage = new GraphImage(graph.getImage());
          graphPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(
              javax.swing.BorderFactory.createLineBorder(ParameterUI.LINE_BORDER_COLOR,
                  ParameterUI.LINE_BORDER_SIZE), "graphPanel",
              javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
              javax.swing.border.TitledBorder.DEFAULT_POSITION, ParameterUI.PAC7000_FONT,
              Color.RED));
        }
        return graphPanel;
      }
    je viens de tester graph.setVisible(true) avant de faire getImage(), cela ne change rien et pack il ne connait pas.

  9. #9
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Je parlais de faire pack() sur le dialogue, pas le panel.

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    ok, donc non a ce moment là, y'a ni eu de setVisble(true) ne de pack(), lol je teste

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    je crois que tu me disais ca pour vérifier que je ne l'avais pas fais, car il fuat le faire après, hihi
    en faisant le pack avant, ma fenêtre est toute petite, on voie que le haut de la fenêtre...

  12. #12
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Ta facon de creer ton dialogue est etrange. Bref, le probleme vient du faite que je pense que tu peins composant avant qu'il ne soit realized. Il faudrait que tu ajoutes l'image au panel plus tard (en creant un setImage() par exemple).

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    comment ca ma façon est étrange, je sais que ce n'est pas super mais j'utilise un peu un GUI, VisualEditor, et donc lui le principe c'est dans le constructeur d'appeler une méthode initialize() qui ajoute tous les panel.... et donc moi le code que j'ai mis getGraphPanel() est appelé à ce moment là donc avant de sortir du constructeur, et donc une fois ma Jdialog créer je l'affiche en faisant setVisible(true).

    surtout que tous les autres composants de ma JDialog sont bien affiché, il y a une liste, un JTextArea, des boutons... et il n'y a pas de probleme.

  14. #14
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Oui mais je te dis que si tu essayes de dessiner ton composant avant qu'il soit realized (ce qui arrive lorsqu'il est visible ou packed) ca ne marchera pas. Qu'il soit affiche a l'ecran ensuite ne change pas le probleme.

  15. #15
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    ok, restons calme, je crois que je ne comprends vraiment pas, j'en suis désolé.
    pour moi, je fais le setVisible(true) seulement une fois qua ma JDialog est complétement créer.... donc qu'une fois qu'il est realized (pour moi).

    Et vous me dite
    si tu essayes de dessiner ton composant avant qu'il soit realized (ce qui arrive lorsqu'il est visible ou packed) ca ne marchera pas
    et pour moi, je le dessine en faisant setVisible(true) seulement une fois que ma JDialog a été initialisé avec touts les ajouts de panel...

  16. #16
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Mais non tu le dessines quand tu appelles graph.getImage().

  17. #17
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    désolé mais je ne comprend plus rien...
    J'ai un composant sur ma fenêtre principale, je veux récupérer son image dans une JDialog quand celle ci s'ouvre suite à un évènement donné.

    L'évènement arrive, je crée ma JDialog d = new JDialog(); d.setVisible(true), et je l'affiche ensuite.
    Ok, maintenant dans le constructeur de ma JDialog j'initialise les différents panels dont celui qui contient mon composant à afficher
    pour cela je fait monComposant.getImage(), et cette image je la dessine dans mon panel.
    je suis désolée de vous embéter, mais il y a un truc que je n'ai vraiment pas compris, vous m'avez dis en faisant le monComposant.getImage() je dessine ma JDialog ??? désolé mais là je ne suis plus, ca à l'air évident pour vous mais pour moi ce n'est pas logique, bref, je vous fait confiance, c'est surment ce qui doit se passer, alors qu'est ce que je dois faire avec le setImage() dont vous m'avez parlé ?

  18. #18
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Pour le moment je vais me coucher Tu peux poster un code source compilable qui reproduit le probleme ? Ca aiderait beaucoup. En tout cas si le composant dont tu veux l'image existe dans une autre fenetre, comme tu le precise clairement dans ton dernier message, tu as raison, il est deja realized et devrait pouvoir etre dessine correctement.

  19. #19
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    ok, bah bonne nuit, au fait en faisant le truc de test, donc en virant tout ce qui n'était pas nécessaire, j'ai vu une partie de l'image s'afficher,
    je pensais que la taille du panel s'adptait à la taille de son contenu, mais apparement non, bref en aggrandisant la taille de la fenêtre ou en réduisant la taille de mon image (j'ai vu comment faire dans la FAQ) cela devrait marcher, excusez moi j'ai été un peu insistante...
    merci encore pour le temps passé...

  20. #20
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Rah je viens de comprendre ton probleme. Il est ici :

    graph.setRectangle(graphPanel.getBounds());

    Quand tu fais ca le graphPanel n'a pas encore de taille definie et ses dimensions sont (0, 0). Dans ton second extrait de getGraphPanel() tu n'as plus cette ligne mais le probleme reste le meme. Tant que tu ne fais pas un pack() (ou un setSize()) sur le dialogue, graphPanel a une taille nulle et donc le rectangle de ton objet graph est aussi nul.

    Je ferais donc ca :

    graphImage = new GraphImage(); // sans image
    // ...
    // apres setSize() ou pack()
    graphImage.setImage(graph.getImage());
    graphImage.repaint();

    Il faut adapter le code de GraphImage pour avoir un setImage() et ne rien faire dans paintComponent() quand l'image est null.

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

Discussions similaires

  1. réafficher une image à partir des données recupérées
    Par vbcasimir dans le forum Langage
    Réponses: 3
    Dernier message: 04/10/2005, 10h50
  2. [ImageMagick] Générer une image à partir de plusieurs images ?
    Par fichtre! dans le forum Bibliothèques et frameworks
    Réponses: 8
    Dernier message: 16/02/2005, 15h32
  3. Dessiner une image en arrière plan d'1 MDI Main Frame
    Par Yacine95000 dans le forum MFC
    Réponses: 3
    Dernier message: 14/06/2004, 10h22
  4. [CR] Inserer une image à partir d'un fichier
    Par Gandalf24 dans le forum SAP Crystal Reports
    Réponses: 7
    Dernier message: 23/07/2003, 10h55
  5. Réponses: 3
    Dernier message: 12/06/2002, 19h03

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