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

Agents de placement/Fenêtres Java Discussion :

Défilement image JFrame


Sujet :

Agents de placement/Fenêtres Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 95
    Par défaut Défilement image JFrame
    Bonjour,

    J'utilise une image de fond pour une JFrame en la mettant dans un JLabel. Est-il possible d'une manière quelconque de faire glisser l'image vers le haut (de manière fluide) au clic sur l'image ?

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Dans le principe, oui. Mais ce serait plus simple d'utiliser un JPanel, dans lequel tu dessines l'image, par drawImage, soit en faisant varier son ordonnée, soit en utilisant une translation, parce que si tu utilises un JLabel, il va falloir déplacer le JLabel, donc supprimer le layout manager de son Container, et ce n'est jamais une bonne idée de se passer de layout manager. Pour la fluidité, la classe JPanel offre une fonctionnalité de double buffering simple à activer (méthode setDoubleBuffered). Pour gérer l'animation, utilise un thread, qui fait varier la coordonnée, ou la valeur de la translation.


    Un exemple de principe :

    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
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    public class ImageScrollDemo extends JPanel {
     
        private final BufferedImage image;
        private int translationY;
        private volatile AnimationThread animationThread;
     
     
        /**
         * @throws IOException
         * 
         */
        public ImageScrollDemo(File imageFile) throws IOException {
            setDoubleBuffered(true); // évite le flickering
            image = ImageIO.read(imageFile);
            translationY = 0;
        }
     
     
        @Override
        public void paint(Graphics g) {
            super.paint(g);
            // l'image est afficher sur la totalité du panel, sans se préoccuper de
            // la déformation due à la taille du panel par rapport à la taille de
            // l'image
            g.drawImage(image, 0, translationY, getWidth(), getHeight(), this);
        }
     
     
        public boolean isAnimated() {
            return animationThread != null;
        }
     
     
        public void startAnimation(int speedInc) {
            if (animationThread == null) {
                animationThread = new AnimationThread(speedInc);
                animationThread.start();
            }
        }
     
     
        public void stopAnimation() {
            if (animationThread != null) {
                animationThread.stopRunning();
            }
        }
     
     
        private class AnimationThread extends Thread {
     
     
            private volatile boolean running; // permet de jouer/arrêter l'animation
            private int speedInc;
     
     
            /**
             * 
             * @param speedInc
             *            vitesse de translation (incrément de déplacement)
             */
            public AnimationThread(int speedInc) {
                this.speedInc = speedInc;
            }
     
     
            @Override
            public void run() {
                running = true;
                while (running) {
                    translationY -= speedInc; // on vait varier l'ordonnée de
                                              // l'incrément
                    repaint(); // on informe SWING qu'on veut que l'affichage du
                               // panel soit rafraichi
                    if (translationY <= -getHeight()) {
                        // on arrête l'animation quand l'image n'est plus visible
                        // dans le panel
                        running = false;
                    } else {
                        // on met en pause le thread
                        try {
                            Thread.sleep(33); // (33ms pour 30 images par seconde)
                        } catch (InterruptedException e) {
                            running = false;
                        }
                    }
                }
                // on arrête l'animation,
                // 1) on remet à zéro la position de l'image
                translationY = 0;
                // 2) pour permettre de relancer l'animation
                animationThread = null;
                // pour rafraichir l'affichage
                repaint();
            }
     
     
            public void stopRunning() {
                interrupt(); // permet de terminer l'animation même lorsqu'elle est
                             // en pause
                running = false;
            }
     
     
        }
     
     
        public static void main(String[] args) {
            try {
                runDemo();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
     
     
        public static void runDemo() throws IOException {
            JFrame frame = new JFrame("Demo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
     
            File imageFile = new File(
                    "C:/Documents and Settings/Joël/Mes documents/Mes images/avatar/suricate.carre.jpg");
            final ImageScrollDemo demo = new ImageScrollDemo(imageFile);
     
     
            JPanel panel = new JPanel();
            panel.setLayout(new BorderLayout());
            panel.add(demo, BorderLayout.CENTER);
     
     
            final JSlider speedSlider = new JSlider(1, 17, 9);
            panel.add(speedSlider, BorderLayout.SOUTH);
     
     
            frame.getContentPane().add(panel);
     
     
            demo.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    if (demo.isAnimated()) {
                        demo.stopAnimation();
                    } else {
                        demo.startAnimation(speedSlider.getValue());
                    }
                }
            });
     
     
            frame.setSize(300, 300);
            frame.setVisible(true);
        }
     
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 95
    Par défaut
    Moi qui m'attendais à une solution assez simple lol. En tout cas merci je vais me pencher là-dessus, l'exemple me sera très utile je pense.

    EDIT : ton exemple est-il sensé être fonctionnel ? Car j'ai beaucoup d'erreurs.Par exemple le repaint() non défini pour le type ImageScrollDemo.AnimationThread

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Halo2550 Voir le message
    Moi qui m'attendais à une solution assez simple.
    Tout dépend ce que tu appelles simple. Personnellement, je ne vois pas ce qu'il y a de compliqué la dedans : un redéfinition de méthode, un Thread avec une boucle super simple, et quelques composants dans une frame, avec un BorderLayout, rien que du classique. C'est sûr que si tu t'attendais à appeler une méthode scrollToUp(), il y'a un peu plus de code.

    Citation Envoyé par Halo2550 Voir le message
    EDIT : ton exemple est-il sensé être fonctionnel ? Car j'ai beaucoup d'erreurs.Par exemple le repaint() non défini pour le type ImageScrollDemo.AnimationThread
    Mon code fonctionne très bien, tant qu'il n'est pas modifié. Il n'y a qu'une seule classe, qui va dans un fichier ImageScrollDemo.java : j'ai même pas mis de package en plus. La méthode repaint() appelée dans la méthode run() du thread est une méthode de JPanel (AnimationThread est une classe interne de ImageScrollDemo) : donc, oui, elle existe bien et c'est une méthode standard des composants SWING.

    EDIT : Je n'ai mis aucun import, parce qu'aucun d'eux ne portait d’ambiguïté, et que les mettre chargeait inutilement le post. Tu les a bien ajoutés ?
    Au cas ou :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import java.awt.BorderLayout;
    import java.awt.Graphics;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
     
     
    import javax.imageio.ImageIO;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JSlider;
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 95
    Par défaut
    Oulà autant pour moi, en adaptant ton code j'ai oublié le extends JPanel ce qui explique tout. *je suis un boulet*

    Pour ce qui est de la simplicité, oui je m'attendais a une dizaine de lignes de code mais bon j'ai peut-être jugé trop vite. En même temps je ne suis pas trop familiarisé avec les threads.

    En tout cas merci pour ton coup de main.

    EDIT : En fait du coup j'ai un problème, ce que je comptais faire c'était mettre une image "par dessus" un formulaire et que lors du clic l'image monte en dévoilant le formulaire mais j'ai beau mettre ce que je veux dessous, lorsque l'image monte la fenetre ou le panel dessous est vierge (meme plus la couleur de background).

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Halo2550 Voir le message
    En fait du coup j'ai un problème, ce que je comptais faire c'était mettre une image "par dessus" un formulaire et que lors du clic l'image monte en dévoilant le formulaire mais j'ai beau mettre ce que je veux dessous, lorsque l'image monte la fenetre ou le panel dessous est vierge (meme plus la couleur de background).
    Si le formulaire occupe tout l'espace de la JFrame dans laquelle il est affiché, je m'orienterais vers une solution avec le GlassPane de la fenêtre. Sinon, vers une solution avec la classe JLayer (qui peut également fonctionner dans le premier cas).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

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

Discussions similaires

  1. problème défilement images en ActionScriptII
    Par cds82 dans le forum Flash
    Réponses: 2
    Dernier message: 10/11/2006, 13h55
  2. Script défilement images
    Par glloq8 dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 24/10/2005, 15h53
  3. [FLASH MX] Problème pour défilement images
    Par Buzhug dans le forum Flash
    Réponses: 10
    Dernier message: 22/10/2004, 21h09

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