JPanel + JScrollPane

Résolu
kels0 Messages postés 5 Date d'inscription mercredi 30 janvier 2008 Statut Membre Dernière intervention 6 juin 2008 - 12 mars 2008 à 14:35
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 - 13 mars 2008 à 01:02
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

uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
12 mars 2008 à 18:12
gd.setPreferredSize(new Dimension(400,1000));
main = new JPanel(new BorderLayout());
3
kels0 Messages postés 5 Date d'inscription mercredi 30 janvier 2008 Statut Membre Dernière intervention 6 juin 2008
12 mars 2008 à 19:33
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 ?
0
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
13 mars 2008 à 01:02
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();
    }
...
}
0
Rejoignez-nous