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

Collection et Stream Java Discussion :

Retirer un element depuis un arrayList en java


Sujet :

Collection et Stream Java

  1. #1
    Inactif  
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 58
    Par défaut Retirer un element depuis un arrayList en java
    Bonjour a tous ,
    S'il vous plait j'ai un petit problème.j'ai un ensemble des textfields crées dynamiquement a l'aide d'un bouton ajouter et je veux ajouter un bouton "retirer" pour supprimer un ou plusieurs éléments selectionnés.j'ai essayé d'utiliser la methode remove mais je n'arrive pas a trouver le résultat souhaité.
    voici le 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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    buttonAdd.addActionListener(e-> addButtons(mainPanel, (Integer)spinner.getValue()));
            buttondelete.addActionListener(new ActionListener(){
     
     
    		@Override
    		public void actionPerformed(ActionEvent arg0) {
    			//int size = textFields.size();
    			//textFields.remove(size);
    			// TODO Auto-generated method stub
    			int x= (Integer)spinner.getValue();
    			    for(int i=textFields.size()-x; i>=textFields.size(); i++)
     
    			    mainPanel.remove(i);
    			System.out.println(textFields.size());
    		}
            });
    	}
     
    	private void addButtons(JPanel panel, int number) {
    		if ( number>0 ) {
    			int count = panel.getComponentCount()/2; // on compte le nombre de composants déjà ajoutés
     
    			GridBagConstraints gbc = new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(2,4,2,4), 0, 0);
    			for(int i=0; i<number; i++) {
     
    				JLabel label = new JLabel(getLabelText(count+i)); // une étiquette pour le champ
    				gbc.gridx = 0;
    				gbc.weightx = 0; 
    				gbc.fill = GridBagConstraints.NONE;
    				panel.add(label, gbc);
     
                   JTextField textField = new JTextField("parameter");  // le champ
                   textField.setPreferredSize( new Dimension( 500, 24 ) );
    				textFields.add(textField);
    				JButton btn = new JButton("help");
    				JPanel pane= new JPanel();
    				pane.add(textField);
    				pane.add(btn);
    				gbc.gridx = 1;
    				gbc.weightx = 1; 
    				gbc.fill = GridBagConstraints.HORIZONTAL;
    				panel.add(pane, gbc);
     
     
     
    			}
    			// on a modifié l'UI alors qu'elle était déjà affichée : on revalide (pour le layout) et on repeint (pour l'affichage)
    			panel.revalidate();
    			panel.repaint();
    		}
     
    	}

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

    Il y a plusieurs problèmes :

    1. for(int i=textFields.size()-x; i>=textFields.size(); i++)Cette boucle ne fait rien sauf si x<=0. En effet, si on appelle textFields.size() size pour simplifier : on comment avec i=size-x, et on boucle si x>=size, ce qui est impossible, si x>0 (i est forcément < size, donc ne peut être >=size.
    2. dans le conteneur, il n'y a pas que des JTextField. Il y a au moins des labels et des boutons (on le voit dans le code d'ajout, qu'on ajoute pour chaque JTextField, un JLabel et un JButton). Tu ne peux donc avoir de corrélation entre la position du field dans la liste et sa position dans la liste des composants du conteneur. Même s'il n'y avait pas ces JLabel et JButton, ce serait risqué de le faire. Il vaut mieux aller chercher l'instance de JTextField dans la liste, et le supprimer, en faisant par exemple remove(textfield.get(i))
    3. Il faut également penser à supprimer le JLabel et le JButton correspondant (ce qui va d'obliger à stocker ces composants, et les liens entre les composants, par exemple, par une Map et une classe qui représentera le trio. Et surtout penser à supprimer le JTextField de la liste, sinon elle va devenir incohérente par rapport à ce qu'il se trouve dans le formulaire, et il y a de fortes chances que ça plante au second appel
    4. comme pour l'ajout, il faut faire un revalidate() et un repaint() à la fin, pour que l'UI se mette à jour.
    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
    Inactif  
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 58
    Par défaut
    merci pour votre explication.j'ai essayé de suivre ces étapes.

  4. #4
    Inactif  
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 58
    Par défaut
    Franchement je ne suis pas génie en java. ce que je peux faire c'est ça:
    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
     
    	HashMap<JLabel,JTextField> hashmap=new HashMap();	
    buttonAdd.addActionListener(e-> addButtons(mainPanel, (Integer)spinner.getValue()));
            buttondelete.addActionListener(new ActionListener(){
     
     
    		@Override
    		public void actionPerformed(ActionEvent arg0) {
    			//int size = textFields.size();
    			//textFields.remove(size);
    			// TODO Auto-generated method stub
    			int x= (Integer)spinner.getValue();
     
    			    for(int i=textFields.size()-x; i>=textFields.size(); i--)
    				hashmap.remove(textFields.get(i));
    			    System.out.println("Size of HashMap after removal : " + hashmap.size());
    			System.out.println(textFields.size());
    		}
            });
    	}
     
    	private void addButtons(JPanel panel, int number) {
    		if ( number>0 ) {
    			int count = panel.getComponentCount()/2; // on compte le nombre de composants déjà ajoutés
     
    			GridBagConstraints gbc = new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(2,4,2,4), 0, 0);
    			for(int i=0; i<number; i++) {
     
    				JLabel label = new JLabel(getLabelText(count+i)); // une étiquette pour le champ
    				gbc.gridx = 0;
    				gbc.weightx = 0; 
    				gbc.fill = GridBagConstraints.NONE;
    				panel.add(label, gbc);
     
                   JTextField textField = new JTextField("parameter");  // le champ
                   textField.setPreferredSize( new Dimension( 500, 24 ) );
    				textFields.add(textField);
    				JButton btn = new JButton("help");
    				JPanel pane= new JPanel();
    				pane.add(textField);
    				pane.add(btn);
    				gbc.gridx = 1;
    				gbc.weightx = 1; 
    				gbc.fill = GridBagConstraints.HORIZONTAL;
    				panel.add(pane, gbc);
     
     
    				hashmap.put(label, textField);
     
    				System.out.println("Size of HashMap after addition : " + hashmap.size());
    			}
    			// on a modifié l'UI alors qu'elle était déjà affichée : on revalide (pour le layout) et on repeint (pour l'affichage)
    			panel.revalidate();
    			panel.repaint();
    		}
     
    	}

  5. #5
    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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    Bah, ce n'est pas si loin de ce qu'il faut faire.

    Il serait plus logique d'avoir un map avec en clef JTextField et valeur associée le JLabel, puisque tu as une liste de JTextField. A partir du JTextField à supprimer, tu retrouves donc le JLabel associé, et tu peux le supprimer aussi.

    Donc :
    Map<JTextField,JLabel> hashmapLabel=new HashMap<>();Ensuite il faut la même chose pour les JButton. Une autre Map.
    Map<JTextField,Jbutton> hashmapButton=new HashMap<>();Donc quand tu créés un trio :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    textFields.add(textField);
    hashmapLabel.put(textField, label);
    hashmapButton.put(textField, btn);
    Quand tu supprimes, pour chaque textfield à supprimer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    pane.remove(textFieldASupprimer);
    panel.remove(hashmapLabel.remove(textFieldASupprimer)); // pour supprimer le JLabel ("en même temps" de la map et du container)
    panel.remove(hashmapButton.remove(textFieldASupprimer)); // pour supprimer le JButton ("en même temps" de la map et du container)
    pour la boucle, si j'ai bien compris, le JSpinner contient le nombre de champs : si on saisit une valeur plus petite que la taille de la liste textFields, alors on supprime ceux en trop.
    Plutôt que de chercher à faire une boucle qui va te poser un problème de gestion des index (compliqué), mais également pour la suppression (à résoudre par un Iterator et Iterator.remove() par exemple), utilise plutôt sublist(), ce qui va te simplifier la vie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    List<JTextField> listeTextFieldASupprimer = textFields.sublist(x, textFields.size()); // on obtient une liste des éléments à supprimer
    for(JTextField textFieldASupprimer : listeTextFieldASupprimer ){ // on les parcourt
         // donc là on supprime
         pane.remove(textFieldASupprimer);
         pane.remove(hashmapLabel.remove(textFieldASupprimer));  
         pane.remove(hashmapButton.remove(textFieldASupprimer));  
    }
    // il reste à supprimer les textfields de la liste de textfields
    listeTextFieldASupprimer.clear(); // c'est ça qui est sympa avec les sublist()...
    pane.revalidate();
    pane.repaint();



    Sinon, je te parlais aussi de faire une classe qui pointe sur les deux composants label et bouton, ou, mieux, les trois, comme ça même plus besoin de Map.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class ComponentHandler {
     
         public final JTextField textField;
         public final JLabel label;
         public final JButton button;
     
         public ComponentHandler(JTextField textField, JLabel label, JButton button) {
               this.textField=textField;
               this.label=label;
               this.button=button;
         }
     
    }
    Au moment où tu crées un JTextField
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    textFields.add(new ComponentHandler(textField, label, btn)); // on pourra changer le nom de la variable textFields (qui bien sûr doit être déclarée en List<ComponentHandler>)
    Et la boucle de suppressions deviens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    List<ComponentHandler> listeTextFieldASupprimer = textFields.sublist(x, textFields.size()); // on obtient une liste des éléments à supprimer
    for(ComponentHandler textFieldASupprimer : listeTextFieldASupprimer ){ // on les parcourt
         // donc là on supprime
         pane.remove(textFieldASupprimer.textField);
         pane.remove(textFieldASupprimer.label);  
         pane.remove(textFieldASupprimer.button);  
    }
    // il reste à supprimer les éléments de la liste textfields
    listeTextFieldASupprimer.clear(); 
    pane.revalidate();
    pane.repaint();
    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.

  6. #6
    Inactif  
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 58
    Par défaut
    j'ai testé le premier 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
    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
    90
    91
     
    buttonAdd.addActionListener(e-> addButtons(mainPanel, (Integer)spinner.getValue()));
            buttondelete.addActionListener(new ActionListener(){
     
     
    		@Override
    		public void actionPerformed(ActionEvent arg0) {
     
    			List<JTextField> listeTextFieldASupprimer = textFields.subList(2, textFields.size()); // on obtient une liste des éléments à supprimer
    			for(JTextField textFieldASupprimer : listeTextFieldASupprimer ){ // on les parcourt
    			     // donc là on supprime
    			     pane.remove(textFieldASupprimer);
    			     pane.remove(hashmapLabel.remove(textFieldASupprimer));  
    			     pane.remove(hashmapButton.remove(textFieldASupprimer));  
    			}
    			// il reste à supprimer les textfields de la liste de textfields
    			listeTextFieldASupprimer.clear(); // c'est ça qui est sympa avec les sublist()...
    			pane.revalidate();
    			pane.repaint();
    		}
            });
    	}
     
    	private void addButtons(JPanel panel, int number) {
    		if ( number>0 ) {
    			int count = panel.getComponentCount()/2; // on compte le nombre de composants déjà ajoutés
     
    			GridBagConstraints gbc = new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(2,4,2,4), 0, 0);
    			for(int i=0; i<number; i++) {
     
    				JLabel label = new JLabel(getLabelText(count+i)); // une étiquette pour le champ
    				gbc.gridx = 0;
    				gbc.weightx = 0; 
    				gbc.fill = GridBagConstraints.NONE;
    				panel.add(label, gbc);
     
                   JTextField textField = new JTextField("parameter");  // le champ
                   textField.setPreferredSize( new Dimension( 500, 24 ) );
    				textFields.add(textField);
    				JButton btn = new JButton("help");
    				JPanel pane= new JPanel();
    				pane.add(textField);
    				pane.add(btn);
    				gbc.gridx = 1;
    				gbc.weightx = 1; 
    				gbc.fill = GridBagConstraints.HORIZONTAL;
    				panel.add(pane, gbc);
    				textFields.add(textField);
    				hashmapLabel.put(textField, label);
    				hashmapButton.put(textField, btn);
    				btn.addActionListener(new ActionListener(){
     
    					@Override
    					public void actionPerformed(ActionEvent arg0) {
    						// TODO Auto-generated method stub
    						new Thread() { 
    							 public void run() { 
    							  Runtime runtime = Runtime.getRuntime(); 
    							  try {
    								runtime.exec(new String[] {"C:\\Program Files (x86)\\Windows NT\\Accessories\\wordpad.exe"} );
    							} catch (IOException e) {
    								// TODO Auto-generated catch block
    								e.printStackTrace();
    							} 
     
    							  /*try { 
    							   BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); 
    							   String line = ""; 
    							   try { 
    							    while((line = reader.readLine()) != null) { 
    							     // Traitement du flux de sortie de l'application si besoin est 
    							    } 
    							   } finally { 
    							    reader.close(); 
    							   } 
    							  } catch(IOException ioe) { 
    							   ioe.printStackTrace(); 
    							  }*/ 
    							 } 
    							}.start();	
    					}
     
    				});
     
    			}
    			// on a modifié l'UI alors qu'elle était déjà affichée : on revalide (pour le layout) et on repeint (pour l'affichage)
    			panel.revalidate();
    			panel.repaint();
    		}
     
    	}
    je mets 2 au lieu de x dans cette instruction List<JTextField> listeTextFieldASupprimer = textFields.subList(2, textFields.size()); puisque si int x= Integer.parseInt(spinner.getValue()) provoque une erreur.
    si je teste ce code un bloc d'errreurs s'affichent:
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at java.awt.Container.remove(Unknown Source)
    at info.xml.swing.MainFrame$DynamicFormExample$4.actionPerformed(MainFrame.java:937)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at java.awt.Container.remove(Unknown Source)
    at info.xml.swing.MainFrame$DynamicFormExample$4.actionPerformed(MainFrame.java:937)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at java.awt.Container.remove(Unknown Source)
    at info.xml.swing.MainFrame$DynamicFormExample$4.actionPerformed(MainFrame.java:937)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

  7. #7
    Inactif  
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 58
    Par défaut
    j'ai testé même la 2 éme solution elle ne me donne pas ni d'erreurs ni de résultat

  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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    Je n'avais pas fait attention que tu collais les JTextField, JLabel et JButton dans un JPanel intermédiaire. A quoi ça sert ? Tu as un JPanel avec une GridBagLayout : c'est une grille, les composants devraient être directement dedans.
    Donc, comme tu as un JPanel intermédiaire, tu peux tout aussi bien simplement retirer ce JPanel : dans la map tu mets le JPanel en valeur, et c'est tout (je parle de celui gérée par la variable pane dans l'ajout).

    Pour la NullPointerException y'a quoi en 937 de MainFrame, qui serait null ?

    Sinon pourquoi tu me parles de Integer.parseInt(spinner.getValue()) alors qu'il y a (Integer)spinner.getValue() dans ton code ? C'est l'un ou l'autre, encore qu'il y a plus de chances que cela soit le second qui soit bon.
    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.

  9. #9
    Inactif  
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 58
    Par défaut
    Bonjour
    j'ai essayé l'idée de supprimer le Panel:
    Voici les codes des 2 classes:
    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
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    public class DynamicFormExample extends JPanel {
     
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
     
    	private List<ComponentHandler> textFields = new ArrayList<>(); // une liste pour retrouver ses champs
     
     
    	public DynamicFormExample() {
    		super(new BorderLayout());
     
     
    		// création des composants statiques
    		JPanel buttonPanel = new JPanel(new BorderLayout()); // un panel pour le champ de saisie du nombre et le bouton +
    		JSpinner spinner = new JSpinner(new SpinnerNumberModel(1,0,10000,10)); // un champ pour saisir le nombre de champs à ajouter
    		JButton buttonAdd = new JButton("+");
    		JButton buttondelete = new JButton("-");
    		JPanel pane= new JPanel(new GridBagLayout());
     
    		GridBagConstraints c = new GridBagConstraints();
     
    			JLabel label = new JLabel("Name:"); // une étiquette pour le champ
    			c.gridx = 0;
    			c.weightx = 0; 
    			c.fill = GridBagConstraints.NONE;
    			pane.add(label, c);
     
    			JTextField textField = new JTextField("");  // le champ
     
    			c.gridx = 1;
    			c.weightx = 1; 
    			c.fill = GridBagConstraints.HORIZONTAL;
    			pane.add(textField, c);
     
    			JLabel labelt = new JLabel("Type:"); // une étiquette pour le champ
    			c.gridx = 0;
    			c.weightx = 0; 
    			c.fill = GridBagConstraints.NONE;
    			pane.add(labelt, c);
     
    			JTextField textFieldt = new JTextField("");  // le champ
     
    			c.gridx = 1;
    			c.weightx = 1; 
    			c.fill = GridBagConstraints.HORIZONTAL;
    			pane.add(textFieldt, c);
    		buttonPanel.add(spinner, BorderLayout.CENTER);
    		JPanel pane1 = new JPanel();
    		pane1.add(buttonAdd);
    		pane1.add(buttondelete);
    		buttonPanel.add(pane1, BorderLayout.EAST);
    		buttonPanel.add(pane, BorderLayout.NORTH);
     
    		add(buttonPanel, BorderLayout.NORTH);
    		JPanel mainPanel = new JPanel(new GridBagLayout()); // un panel pour ajouter les champs dynamiquement
    		JPanel containerPanel = new JPanel(new BorderLayout()); // on a besoin d'un panel intermédiaire pour que les champs soient plaqués en haut de la fenêtre (le + simple pour le faire)
    		containerPanel.add(mainPanel, BorderLayout.NORTH);
    		add(new JScrollPane(containerPanel), BorderLayout.CENTER); // on encapsule le panel des champs dans un scrollpane pour qu'on puisse accèder aux champs qui sont dans la partie non visible de la fenêtre
            JPanel p= new JPanel(new BorderLayout());
    		ImageIcon img= new ImageIcon("images/notification.png");
    		JButton b1= new JButton("Commit");
    		b1.addActionListener(new ActionListener(){
    			public void actionPerformed(ActionEvent e )
    			{
     
    		}});
    		ImageIcon imgprev= new ImageIcon("images/previous.png");
     
    		JButton b2= new JButton("Cancel");
    		b2.addActionListener(new ActionListener(){
    			public void actionPerformed(ActionEvent e){
    				System.exit(0);
     
    		}});
    		JPanel panell= new JPanel();
    		panell.add(b1);
    		panell.add(b2);
    		p.add(panell,BorderLayout.CENTER);
    		JButton butt= new JButton(imgprev);
     
      		butt.addActionListener(new ActionListener(){
      			@Override
      			public void actionPerformed(ActionEvent e)
      			{
      			Algorithms al= new Algorithms();
      				al.visibl1();
      			jif.dispose();
      		}
     
    			});
    		butt.setBorderPainted(false);
    		butt.setFocusPainted(false);
    		butt.setContentAreaFilled(false);
    		JButton buttt= new JButton(img);
    		buttt.setBorderPainted(false);
    		buttt.setFocusPainted(false);
    		buttt.setContentAreaFilled(false);
    		JPanel pan= new JPanel();
    		pan.add(butt);
    		pan.add(buttt);
    		p.add(pan,BorderLayout.WEST);
            add(p,BorderLayout.SOUTH);
     
    		buttonAdd.addActionListener(e-> addButtons(mainPanel, (Integer)spinner.getValue()));
    		buttondelete.addActionListener(e-> removeButtons(mainPanel, (Integer)spinner.getValue()));
     
    	}
     
    	private void addButtons(JPanel panel, int number) {
    		if ( number>0 ) {
    			int count = panel.getComponentCount()/2; // on compte le nombre de composants déjà ajoutés
     
    			GridBagConstraints gbc = new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(2,4,2,4), 0, 0);
    			for(int i=0; i<number; i++) {
     
    				JLabel label = new JLabel(getLabelText(count+i)); // une étiquette pour le champ
    				gbc.gridx = 0;
    				gbc.weightx = 0; 
    				gbc.fill = GridBagConstraints.NONE;
    				panel.add(label, gbc);
     
                   JTextField textField = new JTextField("parameter");  // le champ
                   textField.setPreferredSize( new Dimension( 500, 24 ) );
     
     
    				JButton btn = new JButton("help");
    				JPanel pane= new JPanel();
    				pane.add(textField);
    				pane.add(btn);
    				gbc.gridx = 1;
    				gbc.weightx = 1; 
    				gbc.fill = GridBagConstraints.HORIZONTAL;
    				panel.add(pane, gbc);
     
    				textFields.add(new ComponentHandler(panel)); 
    				btn.addActionListener(new ActionListener(){
     
    					@Override
    					public void actionPerformed(ActionEvent arg0) {
    						// TODO Auto-generated method stub
    						new Thread() { 
    							 public void run() { 
    							  Runtime runtime = Runtime.getRuntime(); 
    							  try {
    								runtime.exec(new String[] {"C:\\Program Files (x86)\\Windows NT\\Accessories\\wordpad.exe"} );
    							} catch (IOException e) {
    								// TODO Auto-generated catch block
    								e.printStackTrace();
    							} 
     
    							  /*try { 
    							   BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); 
    							   String line = ""; 
    							   try { 
    							    while((line = reader.readLine()) != null) { 
    							     // Traitement du flux de sortie de l'application si besoin est 
    							    } 
    							   } finally { 
    							    reader.close(); 
    							   } 
    							  } catch(IOException ioe) { 
    							   ioe.printStackTrace(); 
    							  }*/ 
    							 } 
    							}.start();	
    					}
     
    				});
     
    			}
    			// on a modifié l'UI alors qu'elle était déjà affichée : on revalide (pour le layout) et on repeint (pour l'affichage)
    			panel.revalidate();
    			panel.repaint();
    		}
     
    	}
    	private void removeButtons(JPanel panel, int x) {
     
    			// on a modifié l'UI alors qu'elle était déjà affichée : on revalide (pour le layout) et on repeint (pour l'affichage)
    		List<ComponentHandler> listeTextFieldASupprimer = textFields.subList(x, textFields.size()); // on obtient une liste des éléments à supprimer
    		System.out.println("avant"+textFields.size());
    		for(ComponentHandler textFieldASupprimer : listeTextFieldASupprimer ){ // on les parcourt
    		     // donc là on supprime
     
     
    			panel.remove(textFieldASupprimer.pane);
     
     
     
    		}
    		System.out.println("aprés"+textFields.size());
    		// il reste à supprimer les éléments de la liste textfields
    		listeTextFieldASupprimer.clear(); 
    		panel.revalidate();
    		panel.repaint();
     
     
     
     
    	}
     
     
     
    	/**
             * Cette méthode permet de récupérer toutes les valeurs saisies dans chaque champ (dans l'ordre)
             * @return
             */
    	//public List<String> getTexts() {
    		//return Collections.unmodifiableList(textFields.stream().map(f->f.getText()).collect(Collectors.toList()));
    	//}
     
    	/**
             *  méthode pour déterminer le nom du champ d'index index
             * @param index
             * @return
             */
    	protected String getLabelText(int index) {
    		return "Param " + index;
     
    	}
     
     
     
    }
    et
    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
    package info.xml.swing;
     
     
    import javax.swing.JPanel;
     
     
    public class ComponentHandler {
     
        public final JPanel pane;
     
     
        public ComponentHandler(JPanel pane) {
              this.pane=pane;
                 }
     
    }
    Mais rien de nouveau.Pas de resultat!!!!!

  10. #10
    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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    Salut,

    Déjà, le label étant en dehors de pane, il faut aussi l'ajouter au ComponentHandler :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class ComponentHandler {
     
        public final JPanel pane;
        public final JLabel label;
     
     
        public ComponentHandler(JPanel pane, JLabel label) {
              this.pane=pane;
              this.label=label;
                 }
     
    }
    Ensuite, c'est pane le JPanel dans lequel tu mets les composants, pas panel. Donc il faut créer le ComponentHandler comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    textFields.add(new ComponentHandler(pane, label));
    Ton système de + et - veut dire que le nombre saisi dans le spinner correspond au nombre de composants à ajouter ou à supprimer, pas le nombre de composants en tout (sinon il n'y aurait qu'un seul bouton, ou pas de bouton du tout). Donc, déjà contrôler la valeur pour éviter les exceptions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		if ( x>textFields.size() ) {
    			x=textFields.size();
    		}
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    		List<ComponentHandler> listeTextFieldASupprimer = textFields.subList(textFields.size() - x, textFields.size()); // on obtient une liste des éléments à supprimer
    La boucle devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for(ComponentHandler textFieldASupprimer : listeTextFieldASupprimer ){ // on les parcourt
    		     // donc là on supprime
     
     
    			panel.remove(textFieldASupprimer.pane);
    			panel.remove(textFieldASupprimer.label); 
     
     
     
    		}
    Ensuite, il faut afficher le résultat après le clear(), sinon tu ne verras aucun changement forcément.

    Par ailleurs, au lieu de forcer une taille au JTextField, ce qui sabote l'effet du rempilissage horizontal du GridBagLayout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                   JTextField textField = new JTextField("parameter");  // le champ
                   //textField.setPreferredSize( new Dimension( 500, 24 ) ); // NON : ne jamais faire forcer la taille d'un composant d'UI
     
     
    				JButton btn = new JButton("help");
    				JPanel pane= new JPanel(new BorderLayout()); // permet un remplissage automatique
    				pane.add(textField);
    				pane.add(btn, BorderLayout.EAST);
    Donc la classe entière :

    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
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
     
    public class DynamicFormExample extends JPanel {
     
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
     
    	private List<ComponentHandler> textFields = new ArrayList<>(); // une liste pour retrouver ses champs
     
     
    	public DynamicFormExample() {
    		super(new BorderLayout());
     
     
    		// création des composants statiques
    		JPanel buttonPanel = new JPanel(new BorderLayout()); // un panel pour le champ de saisie du nombre et le bouton +
    		JSpinner spinner = new JSpinner(new SpinnerNumberModel(1,0,10000,10)); // un champ pour saisir le nombre de champs à ajouter
    		JButton buttonAdd = new JButton("+");
    		JButton buttondelete = new JButton("-");
    		JPanel pane= new JPanel(new GridBagLayout());
     
    		GridBagConstraints c = new GridBagConstraints();
     
    			JLabel label = new JLabel("Name:"); // une étiquette pour le champ
    			c.gridx = 0;
    			c.weightx = 0; 
    			c.fill = GridBagConstraints.NONE;
    			pane.add(label, c);
     
    			JTextField textField = new JTextField("");  // le champ
     
    			c.gridx = 1;
    			c.weightx = 1; 
    			c.fill = GridBagConstraints.HORIZONTAL;
    			pane.add(textField, c);
     
    			JLabel labelt = new JLabel("Type:"); // une étiquette pour le champ
    			c.gridx = 0;
    			c.weightx = 0; 
    			c.fill = GridBagConstraints.NONE;
    			pane.add(labelt, c);
     
    			JTextField textFieldt = new JTextField("");  // le champ
     
    			c.gridx = 1;
    			c.weightx = 1; 
    			c.fill = GridBagConstraints.HORIZONTAL;
    			pane.add(textFieldt, c);
    		buttonPanel.add(spinner, BorderLayout.CENTER);
    		JPanel pane1 = new JPanel();
    		pane1.add(buttonAdd);
    		pane1.add(buttondelete);
    		buttonPanel.add(pane1, BorderLayout.EAST);
    		buttonPanel.add(pane, BorderLayout.NORTH);
     
    		add(buttonPanel, BorderLayout.NORTH);
    		JPanel mainPanel = new JPanel(new GridBagLayout()); // un panel pour ajouter les champs dynamiquement
    		JPanel containerPanel = new JPanel(new BorderLayout()); // on a besoin d'un panel intermédiaire pour que les champs soient plaqués en haut de la fenêtre (le + simple pour le faire)
    		containerPanel.add(mainPanel, BorderLayout.NORTH);
    		add(new JScrollPane(containerPanel), BorderLayout.CENTER); // on encapsule le panel des champs dans un scrollpane pour qu'on puisse accèder aux champs qui sont dans la partie non visible de la fenêtre
            JPanel p= new JPanel(new BorderLayout());
    		ImageIcon img= new ImageIcon("images/notification.png");
    		JButton b1= new JButton("Commit");
    		b1.addActionListener(new ActionListener(){
    			public void actionPerformed(ActionEvent e )
    			{
     
    		}});
    		ImageIcon imgprev= new ImageIcon("images/previous.png");
     
    		JButton b2= new JButton("Cancel");
    		b2.addActionListener(new ActionListener(){
    			public void actionPerformed(ActionEvent e){
    				System.exit(0);
     
    		}});
    		JPanel panell= new JPanel();
    		panell.add(b1);
    		panell.add(b2);
    		p.add(panell,BorderLayout.CENTER);
    		JButton butt= new JButton(imgprev);
     
      		butt.addActionListener(new ActionListener(){
      			@Override
      			public void actionPerformed(ActionEvent e)
      			{
      			Algorithms al= new Algorithms();
      				al.visibl1();
      			//jif.dispose();
      		}
     
    			});
    		butt.setBorderPainted(false);
    		butt.setFocusPainted(false);
    		butt.setContentAreaFilled(false);
    		JButton buttt= new JButton(img);
    		buttt.setBorderPainted(false);
    		buttt.setFocusPainted(false);
    		buttt.setContentAreaFilled(false);
    		JPanel pan= new JPanel();
    		pan.add(butt);
    		pan.add(buttt);
    		p.add(pan,BorderLayout.WEST);
            add(p,BorderLayout.SOUTH);
     
    		buttonAdd.addActionListener(e-> addButtons(mainPanel, (Integer)spinner.getValue()));
    		buttondelete.addActionListener(e-> removeButtons(mainPanel, (Integer)spinner.getValue()));
     
    	}
     
    	private void addButtons(JPanel panel, int number) {
    		if ( number>0 ) {
    			//int count = panel.getComponentCount()/2; // on compte le nombre de composants déjà ajoutés
    			int count = textFields.size();
     
    			GridBagConstraints gbc = new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(2,4,2,4), 0, 0);
    			for(int i=0; i<number; i++) {
     
    				JLabel label = new JLabel(getLabelText(count+i)); // une étiquette pour le champ
    				gbc.gridx = 0;
    				gbc.weightx = 0; 
    				gbc.fill = GridBagConstraints.NONE;
    				panel.add(label, gbc);
     
                   JTextField textField = new JTextField("parameter");  // le champ
                   //textField.setPreferredSize( new Dimension( 500, 24 ) );
     
     
    				JButton btn = new JButton("help");
    				JPanel pane= new JPanel(new BorderLayout());
    				pane.add(textField);
    				pane.add(btn, BorderLayout.EAST);
    				gbc.gridx = 1;
    				gbc.weightx = 1; 
    				gbc.fill = GridBagConstraints.HORIZONTAL;
    				panel.add(pane, gbc);
     
    				textFields.add(new ComponentHandler(pane, label)); 
    				btn.addActionListener(new ActionListener(){
     
    					@Override
    					public void actionPerformed(ActionEvent arg0) {
    						// TODO Auto-generated method stub
    						new Thread() { 
    							 public void run() { 
    							  Runtime runtime = Runtime.getRuntime(); 
    							  try {
    								runtime.exec(new String[] {"C:\\Program Files (x86)\\Windows NT\\Accessories\\wordpad.exe"} );
    							} catch (IOException e) {
    								// TODO Auto-generated catch block
    								e.printStackTrace();
    							} 
     
    							  /*try { 
    							   BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); 
    							   String line = ""; 
    							   try { 
    							    while((line = reader.readLine()) != null) { 
    							     // Traitement du flux de sortie de l'application si besoin est 
    							    } 
    							   } finally { 
    							    reader.close(); 
    							   } 
    							  } catch(IOException ioe) { 
    							   ioe.printStackTrace(); 
    							  }*/ 
    							 } 
    							}.start();	
    					}
     
    				});
     
    			}
    			// on a modifié l'UI alors qu'elle était déjà affichée : on revalide (pour le layout) et on repeint (pour l'affichage)
    			panel.revalidate();
    			panel.repaint();
    		}
     
    	}
    	private void removeButtons(JPanel panel, int x) {
     
    		if ( x>textFields.size() ) {
    			x=textFields.size();
    		}
    		List<ComponentHandler> listeTextFieldASupprimer = textFields.subList(textFields.size() - x, textFields.size()); // on obtient une liste des éléments à supprimer
    		System.out.println("avant"+textFields.size());
    		for(ComponentHandler textFieldASupprimer : listeTextFieldASupprimer ){ // on les parcourt
    		     // donc là on supprime
     
     
    			panel.remove(textFieldASupprimer.pane);
    			panel.remove(textFieldASupprimer.label); 
     
     
     
    		}
    		// il reste à supprimer les éléments de la liste textfields
    		listeTextFieldASupprimer.clear(); 
    		System.out.println("aprés"+textFields.size()); 
    		panel.revalidate();
    		panel.repaint();
     
     
     
     
    	}
     
     
     
    	/**
             * Cette méthode permet de récupérer toutes les valeurs saisies dans chaque champ (dans l'ordre)
             * @return
             */
    	//public List<String> getTexts() {
    		//return Collections.unmodifiableList(textFields.stream().map(f->f.getText()).collect(Collectors.toList()));
    	//}
     
    	/**
             *  méthode pour déterminer le nom du champ d'index index
             * @param index
             * @return
             */
    	protected String getLabelText(int index) {
    		return "Param " + index;
     
    	}
     
    }


    Enfin, si tu veux pouvoir récupérer le contentu du textField, ajoute le simplement au ComponentHandler comme les 2 autres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class ComponentHandler {
     
        public final JPanel pane;
        public final JLabel label;
        public final JTextField field;
     
     
        public ComponentHandler(JPanel pane, JLabel label, JTextField field) {
              this.pane=pane;
              this.label=label;
              this.field=field;
                 }
     
    }

    La méthode getTexts() pourra être adaptée comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	public List<String> getTexts() {
    		return Collections.unmodifiableList(textFields.stream().map(f->f.field.getText()).collect(Collectors.toList()));
    	}
    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.

  11. #11
    Inactif  
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 58
    Par défaut
    je vous remercie infiniment Mr Joel Drigo. C'est exactement ce que je veux .

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

Discussions similaires

  1. Trouver un element dans un ArrayList
    Par redsaint0 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 24/03/2008, 16h18
  2. explication ArrayList en java
    Par drexlbob dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 02/02/2008, 00h54
  3. Réponses: 0
    Dernier message: 27/11/2007, 14h37
  4. Supprimer plusieurs elements d'une arraylist
    Par metalcoyote dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 25/01/2007, 14h14
  5. [JSF]Affichage de beans depuis une ArrayList dans une JSP
    Par adrien.nicolet dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 05/06/2006, 17h33

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