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 :

[debutant]Afficher une image en choisissant ses dimensions


Sujet :

AWT/Swing Java

  1. #1
    Membre du Club Avatar de Romain93
    Inscrit en
    Septembre 2005
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 71
    Points : 50
    Points
    50
    Par défaut [debutant]Afficher une image en choisissant ses dimensions
    Bonjour,

    Je souhaite faire quelque chose d'assez simple: une fenetre, avec un slide, qui se deplacerait de 0 a 100%, et une image, dont la taille varierait de 0 a 100% de celle de l'image originale, selon la position du slide, en temps reel.

    Je suis debutant en swing, et je m'y perds un peu dans toutes les classes de manipulation d'images: Icon, Image, BufferedImage, Graphics, AffineTransform...

    J'ai essaye quelque chose avec la methode ImageUpdate, mais ca ne marche pas:

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    import javax.swing.*;          
    import javax.swing.event.*;
    import java.awt.*;
    import java.awt.image.ImageObserver;
     
     
    public class AffImage implements ChangeListener {
     
     
        private int size = 50;
        JLabel picture;	
        Icon icon = new ImageIcon("Spongebob.gif");
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        Image image = toolkit.getImage("Spongebob.gif");    
     
     
        public Component createComponents() {
     
            JSlider slide = new JSlider(JSlider.HORIZONTAL, 0, 100, 50);
            slide.addChangeListener(this);
            slide.setAlignmentX(JLabel.CENTER);
     
            picture = new JLabel(icon);
            picture.setHorizontalAlignment(JLabel.CENTER);
            picture.setAlignmentX(Component.CENTER_ALIGNMENT);
            picture.setLabelFor(slide);
     
            JPanel pane = new JPanel(new GridLayout(0, 2));
            pane.add(slide);
            pane.add(picture);
     
            return pane;
        }
     
     
        private static void createAndShowGUI() {
     
            JFrame frame = new JFrame("SwingApplication");
     
            AffImage app = new AffImage();
            Component contents = app.createComponents();
            frame.getContentPane().add(contents, BorderLayout.CENTER);
     
            //Display the window.
            frame.pack();
            frame.setVisible(true);
        }
     
     
        public static void main(String[] args) {
            //Schedule a job for the event-dispatching thread:
            //creating and showing this application's GUI.
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGUI();
                }
            });
        }
     
     
        public void stateChanged(ChangeEvent e) {
            JSlider source = (JSlider)e.getSource();
            size=(int)source.getValue();
            picture.imageUpdate(image, ImageObserver.WIDTH, 0, 0, icon.getIconWidth()*size/100, 1);
            picture.imageUpdate(image, ImageObserver.HEIGHT, 0, 0, 1, icon.getIconHeight()*size/100);
        }
     
     
    }
    L'image s'affiche, mais elle ne change pas quand je bouge le slider. Peut-etre que la methode imageUpdate n'est pas du tout adaptee, je ne sais pas.

    Voila, peut-etre que pour les habitues, c'est un probleme facile. Je ne demande pas une solution toute faite, mais juste les classes a utiliser.

    Merci d'avance!

  2. #2
    Membre confirmé Avatar de broumbroum
    Profil pro
    Inscrit en
    Août 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 406
    Points : 465
    Points
    465
    Par défaut AffineTransform
    Salut!
    A mon avis l'imageUpdate ne fait pas de transformation sur l'image, seulement un repaint... Si tu veux redimensiionnner l'image alors utilise plutôt la classe Graphics et la fonction drawImage() qui peut prendre une classe AffineTransform avec laquelle tu définis aisément une transformation scalaire telle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AffineTransform tx = AffineTransform.getScaleInstance((double)zoom,(double)zoom); // zoom adapté au proportions
    g.drawImage(im, tx, (ImageObserver)obs); // par exemple dans la méthode paintComponent(Graphics g) du JLabel

  3. #3
    Membre du Club Avatar de Romain93
    Inscrit en
    Septembre 2005
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 71
    Points : 50
    Points
    50
    Par défaut
    Je suis un peu perdu.
    Faut-il que je cree une sous-classe de JLabel qui redefinisse paintComponent, quelque chose comme ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        class ImageLabel extends JLabel {
     
        	ImageLabel(Icon icon) {
        		return super.JLabel(icon);
        	}
     
    		public void paintComponent(Graphics2D g) {
    		    // Appel à la méthode de la super-classe
    		    super.paintComponent(g);
    		    // Dessin de l'image
    		    AffineTransform tx = AffineTransform.getScaleInstance((double)size/100,(double)size/100);
    		    g.drawImage(image, tx, (ImageObserver)obs); 
    		}
        }
    et dans ma methode createComponents, je cree un objet Image label, que j'add a mon JPanel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    picture = new ImageLabel(icon);
    ...
    pane.add(picture);
    J'ai essaye ca, mais ca n'affiche plus d'image... d'ou doit venir mon ImageObserver?

    merci d'avance

  4. #4
    Membre confirmé Avatar de broumbroum
    Profil pro
    Inscrit en
    Août 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 406
    Points : 465
    Points
    465
    Par défaut
    ImageObserver est important en terme de références mémoire pour le Garbage Collector (GC) entre autres... c'est très juste. Dans la plupart des cas, il n'y a pas visiblement de différence entre une valeure nulle ou non pour ce paramètre. Veille bien à appliquer l'image que tu veux, telle l'Icon, et aussi tu pourrais vérifier le rafraichissement des graphiques (Graphics) sur le panel en ajoutant une boucle sur la méthode paint() de celui-ci. exemple rapide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // class A extends JPanel ... 
    while(run == true) {
     new Thread(new Runnable() { public void run() {
    JPanel.this.paint(JPanel.this.getGraphics());
    }}).start();
    Thread.sleep(100);
    }
    // end class A

  5. #5
    Membre du Club Avatar de Romain93
    Inscrit en
    Septembre 2005
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 71
    Points : 50
    Points
    50
    Par défaut
    Bon, j'ai quelque chose qui ne marche pas trop trop mal:

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    import javax.swing.*;          
    import javax.swing.event.*;
    import java.awt.*;
    import java.awt.geom.AffineTransform;
    import java.awt.image.ImageObserver;
     
     
    public class SlidePicture implements ChangeListener {
     
        private static JFrame frame;
        private int size = 50;
        private static Image image;  
        private static String labelPostfix = "%";
        final JLabel label = new JLabel("50" + labelPostfix);
     
        class ImagePane extends JPanel {
     
    		ImagePane() {
    			setPreferredSize(new Dimension(300,300));
    		}
     
    		public void paintComponent(Graphics g) {
    		    // Appel à la méthode de la super-classe
    		    super.paintComponent(g);
    		    // Dessin de l'image
    	        AffineTransform tx = AffineTransform.getScaleInstance((double)size/100,(double)size/100);
    	        ((Graphics2D)g).drawImage(image, tx, (ImageObserver)null);
    		}
        }
     
     
        public JComponent createComponents() {
     
        	JSlider slide = new JSlider(JSlider.HORIZONTAL, 0, 100, 50);
        	slide.addChangeListener(this);
        	slide.setAlignmentX(JLabel.CENTER);
        	slide.setAlignmentY(JLabel.NORTH);
     
            label.setLabelFor(slide);
     
            JPanel pane = new JPanel(new GridLayout(0, 2));
            pane.add(slide);
            pane.add(label);
     
            updatePicture();
     
            return pane;
        }
     
     
        public void stateChanged(ChangeEvent e) {
            JSlider source = (JSlider)e.getSource();
            size=(int)source.getValue();
            label.setText(size + labelPostfix);
            updatePicture();
        }
     
        private void updatePicture () {
            JPanel pic=new ImagePane();
            frame.getContentPane().add(pic, BorderLayout.SOUTH);
            frame.pack();
        }
     
        private static void createAndShowGUI() {
     
            //Create and set up the window.
            frame = new JFrame("SwingApplication");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
            SlidePicture app = new SlidePicture();
     
            Icon icon = new ImageIcon("Spongebob.gif");
     
            Toolkit toolkit = Toolkit.getDefaultToolkit();
            image = toolkit.getImage("Spongebob.gif");
     
            JComponent contents = app.createComponents();
            frame.getContentPane().add(contents, BorderLayout.NORTH);
     
            //Display the window.
            frame.pack();
            frame.setVisible(true);
        }
     
        public static void main(String[] args) {
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGUI();
                }
            });
        }
     
    }
    J'ai en haut de mon JFrame un JPanel avec mon slide, et en dessous un ImagePane, qui est un JPanel dont j'ai redefini la methode paintComponent. A chaque appel de stateChanged, je recree cet ImagePane, et je l'ajoute a ma frame. C'est tordu, ou vous auriez fait a peu pres comme ca?

    Il me reste un dernier souci, mais pas tres grave: le coin haut gauche de l'image est toujours en haut a gauche, et je voudrais que l'image soit centree. La methode DrawImage n'offre pas de parametre pour indiquer ou placer l'image dans le JPanel...

    Merci d'avance!

  6. #6
    Membre du Club Avatar de Romain93
    Inscrit en
    Septembre 2005
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 71
    Points : 50
    Points
    50
    Par défaut
    Ah oui, j'ai aussi un truc un peu bizarre: si j'enleve

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Icon icon = new ImageIcon("Spongebob.gif");
    dans createAndShowGUI(), l'image ne s'affiche plus au lancement de l'application.
    Pourtant je ne me sers d'icon nulle part... mysterieux non? Vous savez d'ou ca peut venir?

Discussions similaires

  1. [Toutes versions] Code pour insérer une image et changer ses dimensions
    Par Ragain dans le forum VBA Word
    Réponses: 6
    Dernier message: 13/11/2011, 17h38
  2. Debutant afficher une Image dans un panel
    Par jejermoa dans le forum Graphisme
    Réponses: 5
    Dernier message: 21/03/2008, 12h35
  3. [DEBUTANT] afficher une image
    Par guiguistuder dans le forum Débuter
    Réponses: 5
    Dernier message: 29/10/2006, 14h39
  4. [debutant] afficher une image...
    Par loic_86 dans le forum 2D
    Réponses: 3
    Dernier message: 12/01/2006, 00h33
  5. [debutant] Afficher une image
    Par HopeLeaves dans le forum 2D
    Réponses: 16
    Dernier message: 14/11/2005, 01h29

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