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 :

Ajouter des JTextField à un JPanel sur clic d'un JButton


Sujet :

AWT/Swing Java

  1. #1
    Membre averti
    Avatar de Kaera
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 185
    Points : 332
    Points
    332
    Par défaut Ajouter des JTextField à un JPanel sur clic d'un JButton
    Bonjour à tous,

    J'ai une fenêtre formulaire contenant X textfields, labels et compagnie.
    Dans cette fenêtre, j'ai un panel (pnlDetailFacture) qui contient au départ 5 JTextField. J'ai créé un bouton qui, à chaque clic, est censé générer 5 nouveaux JTextField sur le modèle des 5 premiers.
    En gros, j'ajoute une ligne de saisie (voir image ci-dessous).


    Je ne trouve pas comment ajouter mes nouveaux JTextField à mon panel.
    Voici mon 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
     
    btnAddOperation.addActionListener(new ActionListener() {
    			private int i=2 ;
    			public void actionPerformed(ActionEvent e) {
    				// TODO Auto-generated method stub
    				Object source = e.getSource();
    				if (source.equals(btnAddOperation)) {
    					JTextField txtRef = new JTextField();
    					pnlDetailFacture.add(txtRef); // ERREUR A CE NIVEAU
    					txtRef.setName(txtRef.getName()+i);
    					// Idem pour les 4 autres champs
    					i++;
    				}
    			}
    		});
    Un grand merci d'avance !
    .
    I'M BACK B*TCHEEEEEZZZZ

  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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    quelle erreur obtiens tu ?

    car c'est bien (en gros) comme ça qu'il faut faire.

    je dis en gros, parce qu'il y a 2 choses à faire en plus, 2 choses qui n'en sont qu'une en fait : le layouting.

    Quant on construit un composant graphique swing on le fait implicitement au premier affichage, mais quand on fait varier l'interface dynamiquement il faut refaire le layout à chaque fois qu'on ajoute un composant graphique : tu peux le faire en appelant doLayout sur chaque composant de ta hiérarchie, mais le plus simple est de faire un revalidate().

    juste après la ligne 9, ajoute :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     pnlDetailFacture.revalidate();



    la seconde chose c'est d'affecter un layoutmanager progressif, qui permettent d'ajouter facilement des lignes de composants.

    tu peux utiliser un GridLayout par exemple, et ajouter une ligne à chaque fois, en ajoutant avant la ligne 9, mais il faudra bien choisir le layoutmanager du parent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    layout.setRows(layout.getRow()+1);
    Voici un exemple rapide basé sur un GridBagLayout :

    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
    public class TestButton {
     
    	private static final int NB_FIELDS = 5;
     
    	public static void main(String[] args) {
     
    		JFrame frame=new JFrame();
     
    		final JPanel panel=new JPanel();
    		frame.getContentPane().add(panel);
    		panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
    		JButton button = new JButton("ADD");
    		panel.add(button);
     
     
     
    		final JPanel fieldpanel=new JPanel();
    		panel.add(new JScrollPane(fieldpanel));
     
    		final GridBagLayout layout = new GridBagLayout();
     
    		fieldpanel.setLayout(layout);
     
     
    		button.addActionListener(new ActionListener() {
     
    			int row=0;
     
    			public void actionPerformed(ActionEvent e) {
    				createFields(fieldpanel, layout, row++);
    			}
    		});
     
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.setSize(300, 300);
    		frame.setVisible(true);
     
    	}
     
    	private static void createFields(JPanel fieldpanel, GridBagLayout layout, int row) {
    		for(int i=0; i<NB_FIELDS; i++) {
    			GridBagConstraints constraint=new GridBagConstraints();
    			constraint.gridx=i;
    			constraint.gridy=row;
    			fieldpanel.add(new JTextField("",10),constraint);
    		}
    		fieldpanel.revalidate();
    		/*//alternative exemple avec doLayout()
    		fieldpanel.getParent().doLayout();
    		fieldpanel.doLayout();*/
    	}
     
    }
    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 confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 312
    Points : 533
    Points
    533
    Par défaut
    Bonjour,

    Peux tu nous donner l'erreur?

    Parce que à priori ton code devrait fonctionner comme dans cet exemple:

    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
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
     
    public class TestSetName extends JFrame implements ActionListener {
    	JButton bouton = new JButton("ajouter");
    	JPanel panel=new JPanel();
    	int compteur;
     
    	public TestSetName() {
    		compteur = 0;
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		JPanel panelNord = new JPanel();
    		panel.add(bouton);
    		bouton.addActionListener(this);
    		add(panelNord,BorderLayout.NORTH);
    		add(panel,BorderLayout.CENTER);
    		bouton.doClick();
    		pack();
    		setVisible(true);	
    	}
    	public void actionPerformed(ActionEvent e) {
    		JTextField tf = new JTextField(3);
    		compteur++;
    		panel.add(tf);
    		tf.setName(tf.getName()+compteur);
    		this.pack();
    		repaint();
    	}
    	public static void main(String[] args) {
    		TestSetName tsn = new TestSetName();
    	}
    }
    A désolé joel.drigo a été plus rapide, tant pis je poste quand même

  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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    @ludomacho a dit :
    A désolé joel.drigo a été plus rapide, tant pis je poste quand même
    heureusement que tu as posté après, ça ma permit de voir que j'avais fait une erreur dans un extrait de code
    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
    Avatar de Kaera
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 185
    Points : 332
    Points
    332
    Par défaut
    Hello joel.drigo, ludomacho et le forum !

    Merci beaucoup à vous deux pour votre aide.
    Je suis désolée de ne réagir que maintenant, les examens du BTS (SIO SLAM en l'occurrence) ont commencé hier donc travail et concentration intenses sont de rigueur !

    J'ai regardé vos deux codes, le mien étant plus proche de celui de ludomacho, c'est pour sa solution que j'ai opté.
    Cependant deux remarques :
    1) Je ne connaissais pas du tout le gridlayout, qui m'a l'air particulièrement pratique ! Mais je dois finir ce programme assez rapidement donc pour le moment, je reste sur mon code actuel mais ayant l'intention, quand j'aurai le temps, d'en faire une appli un peu plus avancée, je me pencherai alors sur cette histoire de GridLayout.

    2) Lorsque je clique sur mon bouton Add, je suis obligée de réduire puis rouvrir la fenêtre pour que les JTextField soient bien affichés !
    Auriez-vous une idée de la cause ?
    .
    I'M BACK B*TCHEEEEEZZZZ

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 312
    Points : 533
    Points
    533
    Par défaut
    bonjour,
    il te faut faire un repaint comme dans mon exemple afin que java redessine les changement.

  7. #7
    Membre averti
    Avatar de Kaera
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 185
    Points : 332
    Points
    332
    Par défaut
    Bonjour ludomacho,
    J'avais testé mais il n'en veut pas : "The method repaint is undefined for the type newActionListener"

    EDIT : Au temps pour moi, ça fonctionne ! Merci beaucoup ludomacho et merci encore à joel.drigo également !
    .
    I'M BACK B*TCHEEEEEZZZZ

  8. #8
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    c'est sur ton composant graphique (le panel qui contient tes jtextfields) qu'il faut appeler ces méthodes : ce sont des méthodes de composants graphiques, pas de listener
    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.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/01/2013, 09h40
  2. Ajouter des TextBox par code sur un Form
    Par ClubberGuy dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 05/05/2011, 16h47
  3. Position des JTextFields et JLabel sur une Fenetre
    Par demcoul dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 16/11/2010, 15h12
  4. [PHP-JS] ajouter des champ en cliquant sur un bouton?
    Par einsteineuzzz dans le forum Langage
    Réponses: 3
    Dernier message: 29/06/2006, 18h36
  5. MapX, Ajouter des bmp et jpeg sur une carte ...
    Par rorodopuis dans le forum C++Builder
    Réponses: 2
    Dernier message: 25/07/2005, 10h07

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