JPanel + JScrollPane [Résolu]

Signaler
Messages postés
5
Date d'inscription
mercredi 30 janvier 2008
Statut
Membre
Dernière intervention
6 juin 2008
-
uhrand
Messages postés
491
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
15 juillet 2012
-
Bonjour !

Je souhaite créer un composant Java, qui permet de visualiser un répertoire contenant des images sous forme de miniature, un peu comme dans l'explorateur windows.

J'ai donc pensé utiliser un JPanel, qui affichera un maximum de miniature en fonction de la taille de la fenêtre (ce que fait très bien JPanel sans JScrollPane).

Mais j'ai un souci, les images ce place en ligne, au lieu de prendre tout l'espace, comme un JPanel ferait normalement ! JScrollBarPane, modifie, je pense, les propriété de mon JPanel contenant les images (gd).

class fenetre extends JFrame {
 
    Image imgs;
    File fl;
    JPanel gd,main;
    JScrollPane js;
   
    fenetre() throws IOException {
        setSize(400,200);
        setDefaultCloseOperation(EXIT_ON_CLOSE);    
       
        fl = new File("C:\\Documents and Settings\\kelso\\Mes documents\\Mes images\\1077.jpg");
        imgs = ImageIO.read(fl);
       
        gd = new JPanel();
        main = new JPanel();
       
        gd.add(new JLabel(new ImageIcon(imgs.getScaledInstance(200, 150, Image.SCALE_DEFAULT))));
        gd.add(new JLabel(new ImageIcon(imgs.getScaledInstance(200, 150, Image.SCALE_DEFAULT))));
        gd.add(new JLabel(new ImageIcon(imgs.getScaledInstance(200, 150, Image.SCALE_DEFAULT))));
        gd.add(new JLabel(new ImageIcon(imgs.getScaledInstance(200, 150, Image.SCALE_DEFAULT))));
        gd.add(new JLabel(new ImageIcon(imgs.getScaledInstance(200, 150, Image.SCALE_DEFAULT))));
        gd.add(new JLabel(new ImageIcon(imgs.getScaledInstance(200, 150, Image.SCALE_DEFAULT))));

       js = new JScrollPane(gd);
       main.add(js);

       add(main);
      
      
        setVisible(true);
    }
}

Merci

3 réponses

Messages postés
491
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
15 juillet 2012
9
gd.setPreferredSize(new Dimension(400,1000));
main = new JPanel(new BorderLayout());
Messages postés
5
Date d'inscription
mercredi 30 janvier 2008
Statut
Membre
Dernière intervention
6 juin 2008

Merci, ça marche, mais pas à 100%, car si je mais 1000 dans PreferredSize, j'ai une longue zone vide, et si j'ai un trop grande nombre de photos, et que je dépasse le 1000 en dimension, je peux plus acceder en scrollant.

Y a t-il un moyen de modifier la taille à la volé, en fonction du nombre de miniature ?
Messages postés
491
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
15 juillet 2012
9
class fenetre extends JFrame {
...
    fenetre() throws IOException {
...
        recalculateSize();
        addComponentListener(new ComponentAdapter() {
            public void componentResized(ComponentEvent e) {
                recalculateSize();
            }
        });
    }
    private void recalculateSize() {
        FlowLayout layout = ((FlowLayout) gd.getLayout());
        int count = gd.getComponentCount();
        int columnW = 200 + layout.getHgap();
        int columnH = 150 + layout.getVgap();
        int panelW = columnW;
        JViewport viewport = (JViewport) gd.getParent();
        if (viewport != null) {
            panelW = viewport.getExtentSize().width;
        }
        int columns = panelW / columnW;
        int rows = count / columns;
        if (count % columns != 0) {
            rows++;
        }
        int panelH = rows * columnH;
        gd.setPreferredSize(new Dimension(panelW, panelH));
        gd.revalidate();
    }
...
}