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 :

création dynamique de composants et jscrollbar


Sujet :

AWT/Swing Java

  1. #1
    Membre du Club
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    65
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 65
    Points : 61
    Points
    61
    Par défaut création dynamique de composants et jscrollbar
    Bonjour

    Dans mon application j'ai besoin de créer des JButton et JTextField dynamiquement (ligne par ligne) et de les positionner (sur la JFrame), Ce que je fais sans problème.
    Ce que je n'arrive pas à faire c'est ajouter ces composants à un JScollPane correctement: soit rien n'est affiché, soit ce n'est pas scrllable (lorsque le LayoutManager est null) soit c'est scrollable mais les composants ne tiennent pas compte des coordonnées que je leur ai associées (à cause du LayaoutManager non null).

    S'il vous plait si quelqun est déja passé par ce genre de problèmes qu'il m'en instruise remercié.

  2. #2
    Membre actif Avatar de Belegkarnil
    Inscrit en
    Juin 2005
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juin 2005
    Messages : 289
    Points : 205
    Points
    205
    Par défaut
    Quel Layout utilise-tu? Comment ajoute-tu tes composants? Peux-tu montrer le code qui doit faire cela?

  3. #3
    Membre éprouvé Avatar de Lady
    Femme Profil pro
    Développeur Java
    Inscrit en
    Mars 2003
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2003
    Messages : 678
    Points : 909
    Points
    909
    Par défaut
    tes composants tu les met dans le JScrollPan via un JPanel ? (sinon c'est normal que ce soit compliqué ^^)

    Je viens de faire ca se matin justement voici un morceau de code :

    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
     
     
    	ArrayList _chro;
     
    	NewChroPan(){
    		this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); // j'ajoute en colonne
     
                    JPanel info = new JPanel(); // le premier panel
    		info.add(new JLabel("Chromosome     "));
    		info.add(new JLabel(" size    "));
    		info.add(new JLabel("       circular"));
    		this.add(info);
     
    		_chro = new ArrayList(); 
    		ChroPan c = new ChroPan(); 
    		_chro.add(c);
    		this.add(c);
    		JPanel plusPan = new JPanel();
    		JButton plus = new JButton("New Chromosome"); // bouton pour ajouter un element dans la "liste"
    		plusPan.add(plus);
    		plus.addActionListener(new AddChro());
    		this.add(plusPan);
     
    	}
     
    	class AddChro implements ActionListener{
     
    		public void actionPerformed(ActionEvent event) {
    			ChroPan c = new ChroPan(); // un JPanel avec des textfield
    			System.out.println(_chro.size());
    			add(c, _chro.size()+1); // j'joute juste avant le panel avec le bouton
    			_chro.add(c);
    			revalidate();
    		}
     
    	}
    ici il s'agit donc du JPanel qui est dans mon scrollPane .. je n'ai pas besoin de toucher au scrollPan car tout ce met a jour quand jajoute dans le JPanel (cf revalidate())
    Informaticienne le jour, créatrice de bijoux la nuit (https://www.facebook.com/La-Fée-Chro...07539656306271) et maman à plein temps !

  4. #4
    Membre du Club
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    65
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 65
    Points : 61
    Points
    61
    Par défaut
    Désolé mais ça fait un bout de temps que j'essaye de revenir au code que j'avais au début mais plus rien ne marche!!

    Même ce code ne donne rien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                    JPanel info = new JPanel(); // le premier panel
    		info.add(new JLabel("Chromosome     "));
    		info.add(new JLabel(" size    "));
    		info.add(new JLabel("       circular"));
    		this.add(info);
    l

  5. #5
    Membre éprouvé Avatar de Lady
    Femme Profil pro
    Développeur Java
    Inscrit en
    Mars 2003
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2003
    Messages : 678
    Points : 909
    Points
    909
    Par défaut
    Citation Envoyé par restricteur Voir le message
    Désolé mais ça fait un bout de temps que j'essaye de revenir au code que j'avais au début mais plus rien ne marche!!

    Même ce code ne donne rien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                    JPanel info = new JPanel(); // le premier panel
    		info.add(new JLabel("Chromosome     "));
    		info.add(new JLabel(" size    "));
    		info.add(new JLabel("       circular"));
    		this.add(info);
    l
    tu le met où ?

    un exemple (j'espere que c'est ce que tu veux)

    dans ta JFrame dans le constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    MyPanel pan = new MyPanel();
    JScrollPan scroll = new JScrollPan(pan);
    this.add(scroll, BorderLayout.CENTER);
    //hum fo ptet donner un taille au sroll pan si c'est du border Layout)
    setVisible(true);
    La class MyJPanel
    le code que j'ai mis tout à l'heure (envelopper comme il faut ^^)
    Informaticienne le jour, créatrice de bijoux la nuit (https://www.facebook.com/La-Fée-Chro...07539656306271) et maman à plein temps !

  6. #6
    Membre du Club
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    65
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 65
    Points : 61
    Points
    61
    Par défaut
    Je le met dans le constructeur de la JFrame

    voici son début:
    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
     
    public class Settings extends javax.swing.JFrame{
     
        /** Creates new form Settings */
        public Settings() {
            initComponents(); 
     
            BufferedReader lec=null;
            vecTex1=new Vector();
            vecTex2=new Vector();
            vecBut=new Vector();
            String[] strTab=null;
            String str="";
     
            JPanel info = new JPanel(); // le premier panel
    		info.add(new javax.swing.JLabel("Chromosome     "));
    		info.add(new javax.swing.JLabel(" size    "));
    		info.add(new javax.swing.JLabel("       circular"));
    		this.add(info);
                    ...

  7. #7
    Membre éprouvé Avatar de Lady
    Femme Profil pro
    Développeur Java
    Inscrit en
    Mars 2003
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2003
    Messages : 678
    Points : 909
    Points
    909
    Par défaut
    Citation Envoyé par restricteur Voir le message
    Je le met dans le constructeur de la JFrame

    voici son début:
    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
     
    public class Settings extends javax.swing.JFrame{
     
        /** Creates new form Settings */
        public Settings() {
            initComponents(); 
     
            BufferedReader lec=null;
            vecTex1=new Vector();
            vecTex2=new Vector();
            vecBut=new Vector();
            String[] strTab=null;
            String str="";
     
            JPanel info = new JPanel(); // le premier panel
    		info.add(new javax.swing.JLabel("Chromosome     "));
    		info.add(new javax.swing.JLabel(" size    "));
    		info.add(new javax.swing.JLabel("       circular"));
    		this.add(info);
                    ...
    normal ^^ si tu le met la faut donner un taille au JPanel info et puis ca depend de ce qu'il y a apres
    Informaticienne le jour, créatrice de bijoux la nuit (https://www.facebook.com/La-Fée-Chro...07539656306271) et maman à plein temps !

  8. #8
    Membre du Club
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    65
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 65
    Points : 61
    Points
    61
    Par défaut
    Tu as raison Lady maintenant mes composants sont affichés, mais à condition de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JPanel info = new JPanel(null);
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JPanel info = new JPanel();
    pour que les composantstiennent compte des cordonnées (avec setbounds).

    Maintenant je fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JScrollPane scroll=new JScrollPane(info);
    mais rien ne se passe: les composant disparaissent!!

  9. #9
    Membre éprouvé Avatar de Lady
    Femme Profil pro
    Développeur Java
    Inscrit en
    Mars 2003
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2003
    Messages : 678
    Points : 909
    Points
    909
    Par défaut
    Citation Envoyé par restricteur Voir le message
    Tu as raison Lady maintenant mes composants sont affichés, mais à condition de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JPanel info = new JPanel(null);
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JPanel info = new JPanel();
    pour que les composantstiennent compte des cordonnées (avec setbounds).

    Maintenant je fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JScrollPane scroll=new JScrollPane(info);
    mais rien ne se passe: les composant disparaissent!!
    vois tu le scrollPane ?? comment l'ajoute tu a la JFrame ?
    Informaticienne le jour, créatrice de bijoux la nuit (https://www.facebook.com/La-Fée-Chro...07539656306271) et maman à plein temps !

  10. #10
    Membre du Club
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    65
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 65
    Points : 61
    Points
    61
    Par défaut
    Moi je faisais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                    this.add(info);
                    info.setBounds(this.getBounds());
                    JScrollPane scroll=new JScrollPane();
                    scroll.setViewportView(info);
                    scroll.setVisible(true);
                    this.getContentPane().add(scroll);
    j'ai adopté ton code mais ça n'a pas marché

  11. #11
    Membre du Club
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    65
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 65
    Points : 61
    Points
    61
    Par défaut
    voici un code simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    JPanel info = new JPanel(); // le premier panel
            info.add(new javax.swing.JLabel("Chromosome     "));
    	info.add(new javax.swing.JLabel(" size    "));
    	info.add(new javax.swing.JLabel("       circular"));
            info.setBounds(this.getBounds());
     
            JScrollPane scro=new JScrollPane();
            this.add(scro);
     
            scro.setBounds(this.getBounds());
            scro.setViewportView(info);
            scro.setVisible(true);
    Avec ceci un les composants (les labels ic) sont affichés et un cadre est déssiné autour (le cadre du JScrollPane je suppose) mais il n'y a pas de barre de défilement quand la taille de la fenêtre est réduite. Et même quand je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setPreferredSize(new java.awt.Dimension(200,200))
    rien ne se passe en réduisant la taille de la JFrame.
    Quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scro.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
    alors une piste horizontale de défilement apparait (tack) mais sans la barre (knob) peu importe la taille de la fenêtre.


    Je suis vraiement perdu avec ça!!

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    Bonjour,

    T'aider serait plus simple si tu nous donnais un SSCCE.

    Ci-dessous un petit code basé sur le tien, et qui semble fonctionner : le redimensionnement de la fenêtre fait apparaître les barres de défilement.

    Si cela ne te convient pas, poste à ton tour un exemple minimal compilable montrant le dysfonctionnement que tu souhaites corriger...

    Nicolas

    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
    // appeler ce fichier Test.java
     
    import javax.swing.*;
     
    public class Test extends JFrame {
     
        public Test() {
     
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
            JPanel info = new JPanel(); // le premier panel
            info.add(new javax.swing.JLabel("Chromosome     "));
    	info.add(new javax.swing.JLabel(" size    "));
    	info.add(new javax.swing.JLabel("       circular"));
            info.setBounds(this.getBounds());
     
            JScrollPane scro=new JScrollPane(info);
            this.add(scro);
            this.pack();
            this.setVisible(true);  
        }
     
        public static void main(String[] args) {
            new Test();
        }
     
    }

  13. #13
    Membre du Club
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    65
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 65
    Points : 61
    Points
    61
    Par défaut
    Je m'excuse de ne pas avoir donné du code minimale compilable. Mais ce que tu viens de faire là est bien: Effectivement "ça scroll" quand on redimensionne la fenêtre. Mais lorsque je veux positionner les composants à l'aide de setBounds il me faut d'abord rendre le LayOutManager égal à null. mais quand je fais ça alors "ça ne scroll plus"!! Voici le code que tu as demandé:

    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
     
    // appeler ce fichier Test.java
     
    import javax.swing.*;
     
    public class Test extends JFrame {
     
        public Test() {
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JPanel info = new JPanel(null); // null pour pouvoir positionner les labels
     
            JLabel labA=new javax.swing.JLabel("Chromosome     ");
            JLabel labB=new javax.swing.JLabel(" size    ");
            JLabel labC=new javax.swing.JLabel("       circular");
     
            info.add(labA);
    	info.add(labB);
    	info.add(labC);
            info.setBounds(this.getBounds());
     
            labA.setBounds(0,0,100,100);//Test avec un seul label
     
     
     
            JScrollPane scro=new JScrollPane(info);
            this.add(scro);
            this.pack();
            this.setVisible(true);}
     
    }
    C'est quoi ce mystère!!

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    Il me semble qu'il faut indiquer la prefferedSize du JPanel info.
    Regarde le code ci-dessous. Cela fonctionne. En cas de redimensionnement, les ascenseurs apparaissent.
    Tu peux remplacer this.pack() par un this.setSize() avec des petites dimensions : les ascenseurs apparaissent alors dès le début.

    Nicolas

    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
    // appeler ce fichier Test.java
     
    import java.awt.Color;
    import java.awt.Dimension;
    import javax.swing.*;
     
    public class Test extends JFrame {
     
        public Test() {
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JPanel info = new JPanel(null); // null pour pouvoir positionner les labels
            info.setPreferredSize(new Dimension(500,500));
     
            JLabel labA=new javax.swing.JLabel("Chromosome     ");
            labA.setBackground(Color.YELLOW);
            labA.setOpaque(true);
            JLabel labB=new javax.swing.JLabel(" size    ");
            labB.setBackground(Color.BLUE);
            labB.setOpaque(true);
            JLabel labC=new javax.swing.JLabel("       circular");
            labC.setBackground(Color.RED);
            labC.setOpaque(true);
     
            info.add(labA);
            info.add(labB);
            info.add(labC);
            info.setBounds(this.getBounds());
     
            labA.setBounds(0,0,100,100);//Test avec un seul label
            labB.setBounds(150,150,100,100);
            labC.setBounds(300,300,100,100);
     
            JScrollPane scro=new JScrollPane(info);
            this.add(scro);
            this.pack(); // this.setSize(200,200);
            this.setVisible(true);
            this.repaint();
        }
     
     
        public static void main(String[] args) {
            new Test();
        }
    }

  15. #15
    Membre du Club
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    65
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 65
    Points : 61
    Points
    61
    Par défaut
    Merci Nicolas_75 maitenant c'est nickel avec ton code mais à condition de ne pas faire appel au concepteur graphique de netbeans (IDE avec lequel je travail): il parait que la méthode initComponents généré par le concepteur est responsable elle aussi du disfonctionnement de ton code.

    Bon je vais coder cette classe à la main.

    Encore merci à tous.

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    Si tu parles de Matisse, je ne peux pas t'aider, car, bien que j'utilise également Netbeans , je construis mes interfaces à la main.

    Pour ma part, je t'en prie.

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

Discussions similaires

  1. accélérer la création dynamique de composants
    Par Melodie dans le forum Débuter
    Réponses: 14
    Dernier message: 16/04/2009, 17h34
  2. Création dynamique de composants
    Par tsikpemoise dans le forum JSF
    Réponses: 3
    Dernier message: 01/12/2008, 17h30
  3. Création dynamique de composants
    Par persam dans le forum Delphi
    Réponses: 3
    Dernier message: 09/01/2007, 10h58
  4. Réponses: 3
    Dernier message: 16/05/2006, 16h24
  5. Création dynamique de composants et destruction
    Par cpdump dans le forum Composants VCL
    Réponses: 4
    Dernier message: 19/01/2005, 17h57

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