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 :

Zoom + Scroll


Sujet :

Agents de placement/Fenêtres Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 21
    Par défaut Zoom + Scroll
    Bonjour à tous !

    Je débute un nouveau projet en java et j'aimerais savoir si il est possible de pouvoir zoomer sur une image dans une JFrame et faire apparaitre les deux scroll barres en même temps ?
    Ainsi j'aurai l'image zoomer, mais je pourrai défiler de haut en bas et de droite à gauche pour voire la totalité de l'image. Lorsque l'image est à taille réelle , les scrolls n'apparaitraient pas .

    Est-ce qu'il ya moyen de faire ça simplement ?

    Merci d'avance pour votre réponse

  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,

    Oui, c'est faisable :

    1) fait une classe qui étend JPanel et qui dessine l'image dans une taille qui dépend du facteur de zoom (en étendant la méthode paint() (méthode drawImage de Graphics) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public void paint(Graphics g) {
    }
    2) mets ce JPanel dans un JScrollPane. Ensuite, en fonction du zoom, l'image va changer de taille, donc le JPanel devrait aussi, de manière à ce que le JScrollPane réagisse en affichant des assenseurs adaptés. La méthode pour y parvenir est expliquée dans ce tutoriel oracle.

    Et voilà ce que ça donne, tout simplement :

    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
    public class ImagePanel extends JPanel {
     
        private BufferedImage image;
        private float zoom;
        private int imageWidth;
        private int imageHeight;
     
        public ImagePanel(BufferedImage image) {
            this.image=image;
            this.zoom=1;
            updateImageSize();
        }
     
        public void setZoom(float zoom) {
            this.zoom = zoom;
            updateImageSize();
            revalidate();
        }
     
        private void updateImageSize() {
            imageWidth=(int) (image.getWidth()*zoom);
            imageHeight=(int) (image.getHeight()*zoom);
        }
     
        @Override
        public Dimension getPreferredSize() {
            return new Dimension(imageWidth, imageHeight);
        }
     
        @Override
        public void paint(Graphics g) {
            super.paint(g);
            g.drawImage(image, 0, 0, imageWidth, imageHeight, this);
        }
     
        public static void main(String[] args) {
     
     
            try {
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
                JPanel panel = new JPanel();
                panel.setLayout(new BorderLayout());
     
                final ImagePanel imagePanel = new ImagePanel(ImageIO.read(new File("C:/Documents and Settings/Joël/Mes documents/Mes images/avatar/suricate.carre.jpg")));
                panel.add(new JScrollPane(imagePanel), BorderLayout.CENTER);
     
                final JSlider slider = new JSlider(0, 100, 0);
                panel.add(slider, BorderLayout.SOUTH);
                slider.addChangeListener(new ChangeListener() {
     
                    @Override
                    public void stateChanged(ChangeEvent e) {
                        imagePanel.setZoom(1+slider.getValue()/10f);
                    }
                });
     
                frame.setContentPane(panel);
     
     
                frame.setSize(200,200);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
     
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
     
     
        }
     
    }
    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 averti
    Inscrit en
    Janvier 2010
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 21
    Par défaut
    Merci de ta réponse. Mais ma question était :
    Est-ce possible de ne faire apparaitre les ScrollBars uniquement lorsque qu'on zoom ?
    Mon objectif est de faire :
    double click = zoom sur la fenêtre donc apparition des ScrollBars
    encore un double click = dezoom et disparition des ScrollBars.

    Dis moi si tu ne comprends pas ce que je veux dire ^^

  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
    C'est bien le cas avec mon exemple : les ascenseurs n'apparaissent que si l'image est plus grande que l'espace qui l'affiche. En fait, ils apparaissent dès que la dimension renvoyée par getPreferredSize() est plus grande que la zone affichée par le JScrollPane, et disparaissent dans le cas contraire.

    En fait ce sont les méthodes JScrollpane.setHorizontalScrollBarPolicy()) et JScrollPane.setVerticalScrollBarPolicy() qui permettent de configurer l'affichage parmi :
    • Toujours visible
    • Jamais visible
    • Visible uniquement lorsque nécessaire


    Et c'est ce dernier cas qui est paramétré par défaut.
    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 averti
    Inscrit en
    Janvier 2010
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 21
    Par défaut
    Ok, merci du coup j'ai bien compris. C'est juste que mon image était vraiment grosse, du coup je m'en rendais pas compte.

    Je galère juste pour les ratio des zoom, pour avoir un dezoom = taille de l'image...
    Je vais essayer de me renseigner sur les ratios adéquats.

  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
    Salut,

    Au lieu de te baser sur la taille de l'image, tu peux te baser sur une taille arbitraire (que tu peux aussi associer par évènement à la taille de la fenêtre, ou l'écran, par exemple) : ainsi en facteur zoom=1, l'image, quelque soit sa taille, sera toujours affichée dans une taille déterminée (qui ne dépend pas de la taille de l'image). Autrement dit, comme drawImage(image, x, y, width, height) adapte l'affichage de l'image à la taille imposée par width et height, ces valeurs peuvent être n'importe quoi (>0 du moins).

    Pour déterminer la taille arbitraire, il faut tout de même tenir compte de l'image : celle-ci n'étant pas forcément carrée, il faut déterminer l'une des dimensions relativement à la dimension correspondant de l'image, par facteur d'échelle de l'autre dimension par rapport celle correspondante de l'image, en fonction de celle qui est la plus grande (de manière à ce que la taille finale ne soit pas plus grande que les dimensions arbitraire). Ce qui donne :

    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
    // la taille de l'image
    int width = image.getWidth();
    int height = image.getHeight();
     
    // la taille arbitraire
    int fixedWidth=200;
    int fixedHeight=200;
     
    // la taille d'affichage de l'image pour le zoom facteur 1
    int displayHeight;
    int displayWidth;
     
    if( height>width ) {
       displayHeight = fixedHeight;
       float scale = ((float)fixedHeight)/height; 
       displayWidth = (int) (width * scale);
    } else {
       displayWidth = fixedWidth;
       float scale = ((float)fixedWidth)/width; 
       displayHeight = (int) (height * scale);
    }
    Et updateImageSize devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private void updateImageSize() {
            imageWidth=(int) (displayWidth*zoom);
            imageHeight=(int) (displayHeight*zoom);
        }
    Tu peux, en plus, éventuellement ajuster les coordonnées x et y d'affichage de l'image pour quelle soit centrée.
    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.

Discussions similaires

  1. Zoom et Scroll sur une PictureBox avec BackgroundImage
    Par Khoral dans le forum Windows Forms
    Réponses: 5
    Dernier message: 15/10/2009, 15h18
  2. [VB6][Graphisme] Zoom
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 10/10/2002, 17h30
  3. scroll dans un label
    Par Pretender dans le forum Composants VCL
    Réponses: 9
    Dernier message: 27/09/2002, 17h06
  4. Zoom avec du TJPEG
    Par Thylia dans le forum C++Builder
    Réponses: 3
    Dernier message: 17/06/2002, 16h03
  5. URGENT : Zoom et changement de repère
    Par poca10 dans le forum MFC
    Réponses: 5
    Dernier message: 28/05/2002, 13h32

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