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 :

JScrollPane Dynamique dans JPanel


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Inscrit en
    Janvier 2004
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 208
    Par défaut JScrollPane Dynamique dans JPanel
    Bonsoir,

    J’essaie de dynamiser le JscrollPane d'un Jpanel contenant de labels a dimension fixe représentant des cellules. Jusque la pas de problème, mon scrollpane fonctionne plus ou moins comme je veux. A un détail près selon le nombre de ligne et de colonne de cellules (label), il me manque la visibilité totale de la dernière ligne.

    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
     
    package test;
     
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.ComponentEvent;
    import java.awt.event.ComponentListener;
     
    class MyPanelScrolled extends JPanel implements ComponentListener{
     
        private JLabel[] labels = new JLabel[100];
        final int TOTAL_CELLULE = 100;
        public MyPanelScrolled(){
     
            setBackground(Color.WHITE);
            setBorder(BorderFactory.createLineBorder(Color.GRAY));
            setLayout(new FlowLayout(FlowLayout.LEFT, -1, -1));
     
            setPreferredSize(new Dimension(0, 0));
            addComponentListener(this);
     
            for(int i=0; i< TOTAL_CELLULE; i++){
                labels[i] = new JLabel("Label " + i);
                labels[i].setPreferredSize(new Dimension(150, 150));
                labels[i].setVerticalAlignment(JLabel.CENTER);
                labels[i].setHorizontalAlignment(JLabel.CENTER);
                labels[i].setBorder(BorderFactory.createLineBorder(Color.GRAY));
     
                add(labels[i]);
            }
     
        }
     
        @Override
        public void componentResized(ComponentEvent e) {
     
            int colonne = this.getWidth() / 150;
            int row = this.getHeight() / 150;
            int totalScroll = (150*TOTAL_CELLULE) / colonne;
     
            setPreferredSize(new Dimension((colonne*150) + 1, totalScroll));
     
            System.out.println("Nombre colonne : " + colonne);
            System.out.println("Nombre ligne : " + row);
            //System.out.println("Total Scroll : " + totalScroll);
            System.out.println("Total Height : " + this.getHeight());
     
            //revalidate();
            //repaint();
     
        }
     
        @Override
        public void componentMoved(ComponentEvent e) {}
     
        @Override
        public void componentShown(ComponentEvent e) {}
     
        @Override
        public void componentHidden(ComponentEvent e) {}
     
     
    }
    public class TestScrollPane2 extends JFrame {
     
        private MyPanelScrolled panel;
        public TestScrollPane2(){
     
            setTitle("Scroll test panel");
            setSize(320, 200);
     
            Container contenu = getContentPane();
     
            panel = new MyPanelScrolled();
     
            JScrollPane scroll = new JScrollPane(panel);
            scroll.setWheelScrollingEnabled(true);
     
            contenu.add(scroll, BorderLayout.CENTER);
     
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setLocationRelativeTo(null);
        }
     
        public static void main(String[] args){
     
            new TestScrollPane2().setVisible(true);
        }
    }
    merci

  2. #2
    Membre éprouvé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 86
    Par défaut
    Hello nashouille,

    D'après ton code, tu utilises un tableau de 100 JLabel (donc nombre de composant déjà définitif) et puis un FlowLayout !
    Le résultat affiché est logique car selon les dimensions de ton conteneur, les JLabels vont se suivre jusqu'à la fin de la largeur du conteneur puis retour à la ligne, ce qui veut dire que selon la dimension de ta fenêtre, la dernière ligne sera complète ou non...

    Si tu veux faire un tel composant, il va falloire que le nombre de JLabels soit dynamique et qu'il soit calculable à chaque repaint de fenêtre (c'est à dire à chaque redimensionnement).

    Pour éviter tout calcul, je te conseil d'utiliser un GridBagLayout pour ton MyPanelScrolled :

    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
     
     
    class MyPanelScrolled extends JPanel {
     
     
    	private class customLabel extends JLabel {
    		public customLabel(String text) {
    			super(text);
    			setPreferredSize(new Dimension(150, 150));
    			setVerticalAlignment(JLabel.CENTER);
    			setHorizontalAlignment(JLabel.CENTER);
    			setBorder(BorderFactory.createLineBorder(Color.GRAY));
    		}
    	}
     
    	public MyPanelScrolled(){
     
    		setBackground(Color.WHITE);
    		setBorder(BorderFactory.createLineBorder(Color.GRAY));
    		setLayout(new GridBagLayout());
     
    		GridBagConstraints gbc = new GridBagConstraints();
    		gbc.weightx = gbc.weighty = 1.0;
    		gbc.fill = GridBagConstraints.BOTH ;
    		gbc.insets = new Insets(1, 1, 1, 1);
     
    		for (int i = 0; i < 10; i++) {
    			for (int j = 0; j < 10; j++) {
    				gbc.gridx = j;
    				gbc.gridy = i;
    				add(new customLabel("Label "+i+j), gbc);
    			}
    		}
    	}
    }
     
    public class TestScrollPane2 extends JFrame {
     
    	public TestScrollPane2(){
    		setTitle("Scroll test panel");
    		setSize(320, 200);
     
    		Container contenu = getContentPane();
     
    		JScrollPane scroll = new JScrollPane(new MyPanelScrolled());
    		scroll.setWheelScrollingEnabled(true);
     
    		contenu.add(scroll, BorderLayout.CENTER);
     
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setLocationRelativeTo(null);
    	}
     
    	public static void main(String[] args){
     
    		new TestScrollPane2().setVisible(true);
    	}
    }

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Oui, ou utiliser ce qui est prévu pour ce genre de cas: un JTable.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 86
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Oui, ou utiliser ce qui est prévu pour ce genre de cas: un JTable.
    Effectivement, comme le signale tchize, tu peux reproduire le même affichage dans ton JScrollPane en utilisant une JTable, à moins que tu as des contraintes de spécification... Mains si tu en a pas, l'utilisation d'une JTable est plus judicieuse.

Discussions similaires

  1. Ajout/Suppression dynamique de JPanel (dans un autre JPanel)
    Par Carvallegro dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 16/05/2012, 09h52
  2. Création dynamique de JLabel dans JPanel
    Par nims dans le forum Débuter
    Réponses: 1
    Dernier message: 01/10/2010, 11h04
  3. ajout d'un Graphics dans un jScrollPane dynamiquement
    Par rocel dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 15/05/2008, 16h47
  4. Réponses: 1
    Dernier message: 22/10/2006, 16h15
  5. [D7] Tableaux dynamiques dans un record
    Par bobby-b dans le forum Langage
    Réponses: 2
    Dernier message: 30/06/2004, 23h23

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