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

Composants Java Discussion :

Mise à jour d'une JList


Sujet :

Composants Java

  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 469
    Par défaut Mise à jour d'une JList
    Bonjour.
    J'ai créé une JList personnalisée pour gérer des listes de String. Cette classe fonctionne parfaitement dans plusieurs programme. Aujourd'hui j'ai voulu l'utiliser dans un cas particulier et là patatrac, bien que la liste des données se mettent bien à jour, l'affichage lui ne veut pas se rafraichir. C'est peut-être (sans doute) une erreur idiote mais ça fait deux jours que je suis dessus et je n'arrive pas à trouver une solution.
    Voici la classe de JList que j'ai appelé ListeString
    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
     
    import java.util.List;
    import java.util.TreeSet;
    import javax.swing.JList;
     
    public class ListeString extends JList<String> 
    {
    	/**
             *      Pour renvoyer une liste de chaînes au format CSV j'ai décidé d'utiliser le point-virgule comme 
             * séparateur. Par conséquent une donnée de la liste comportant un point-virgule sera considéré comme
             * deux données. Il faut donc remplacer les point-virgules des données par une chaîne non ambigüe.
             * J'utiliserai la chaîne "<pv>" pour remplacer les points virgules.
             */
    	public static String pv = "<pv>";
     
    	//Modèle de la liste
    	private ModeleListeString modele;
    	//la liste est dans le modèle pas dans le composant car sinon les modifications de la liste 
    	//qui se font via le modèle ne sont pas répercutées dans la listeString
    	/**
             * Créer une liste
             */
    	public ListeString(List<String> liste)
    	{
    		modele = new ModeleListeString(liste);
    		setModel(modele);
    	}
    	public ListeString(TreeSet<String> liste) 
    	{
    		modele = new ModeleListeString(liste);
    		setModel(modele);
    	}
    	/**
             * Ajoute une ligne
             */
    	public void ajoute(String s)
    	{
    		modele.addElement(s);
    	}
     
    	public void ajoute(String s, int index)
    	{
    		if (index >= getNombreElements()) ajoute(s);
    		else modele.addElement(s,index);
    	}
     
    	/**
             * Ajoute plusieurs lignes
             */
    	public void ajoute(List<String> liste)
    	{
    		modele.ajouteTout(liste);
    	}
    	/**
             * Renvoie le nombre de lignes
             */
    	public int getNombreElements()
    	{
    		return modele.getSize();
    	}
    	/**
             * Renvoie la donnée à l'indice indiqué
             */
    	public String getDonnee(int indice)
    	{
    		return modele.getElementAt(indice);
    	}
    	/**
             * remplace la donnée à l'indice donné
             * @param indice
             */
    	public void setDonnee(int indice, String s)
    	{
    		modele.setElementAt(indice,s);
    	}
    	/**
             * Retire une donnée
             */
    	public void retire(String s)
    	{
    		modele.removeElement(s);
    	}
    	/**
             * retire tout une liste
             * @param liste
             */
    	public void retireTouteLaListe(List<String> liste)
    	{
    		modele.retireTouteLaListe(liste);
    	}
    	/**
             * vide la liste
             */
    	public void retireTout()
    	{
    		modele.retireTout();
    	}
    	/**
             * retire l'objet i
             * @param i : le numéro de l'objet à retirer
             */
    	public void retire(int i) 
    	{
    		modele.retire(i);
    	}
    	/**
             * La liste des données
             * @return : les données
             */
    	public List<String> getDonnees() 
    	{
    		return modele.getDonnees();
    	}
    	/**
             * remplace les données par une autre liste
             * @param liste : la nouvelle liste
             */
    	public void remplaceDonnees(List<String> liste) 
    	{
    		modele.retireTout();
    		modele.ajouteTout(liste);
    	}
     
    	public void remplaceDonnees(TreeSet<String> liste) 
    	{
    		modele.retireTout();
    		modele.ajouteTout(liste);
    	}
     
    	public List<String> getListe() 
    	{
    		return modele.getDonnees();
    	}
     
    	//renvoie la liste sous forme d'une chaîne de mots séparés par des ";"
    	//on remplace donc les ; des mots de la liste par "<pv>"
    	public String getTextCSV() 
    	{
    		String retour = "";
    		for(String s : getListe())
    		{
    			s = s.replace(";", "<pv>");
    			retour += (retour.isEmpty() ? s : ";"+s);
    		}
    		return retour;
    	}
     
    	//traite les chaines qui ont été renvoyées via getTextCSV
    	public static String traiterChaine(String s)
    	{
    		return s.replace("<pv>", ";");
    	}
     
    	public void setListe(List<String> liste) 
    	{
    		modele.setListe(liste);
    	}
     
    	public boolean contient(String s)
    	{
    		return (modele.contient(s));
    	}
     
    	public void retireTouteLaListe(TreeSet<String> liste) 
    	{
    		  modele.retireTouteLaListe(liste);
    	}
    }
    Voici le modèle
    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
     
    import java.util.ArrayList;
    import java.util.List;
    import java.util.TreeSet;
     
    import javax.swing.AbstractListModel;
     
    public class ModeleListeString extends AbstractListModel<String>
     
    {
    	//stocke les données
    	private ArrayList<String> donnees;
    	public ModeleListeString(List<String> liste)
    	{
    		donnees = new ArrayList<String>(liste);
    	}
     
    	public ModeleListeString(TreeSet<String> liste) 
    	{
    		donnees = new ArrayList<String>(liste);
    	}
     
    	@Override
    	public int getSize() 
    	{
    		return donnees.size();
    	}
     
    	@Override
    	public String getElementAt(int index) 
    	{
    		return donnees.get(index);
    	}
     
    	public void addElement(String s)
    	{
    		int index = donnees.size();
    		donnees.add(s);
    		fireIntervalAdded(this, index, index);
    	}
     
    	public void addElement(String s, int index) 
    	{
    		donnees.add(index, s);
    		fireIntervalAdded(this, index, index);
    	}
     
    	public void removeElement(String s)
    	{
    		int index = donnees.indexOf(s);
    		donnees.remove(index);
    		fireIntervalRemoved(this, index, index);
    	}
     
    	public void ajouteTout(List<String> liste) 
    	{
    		donnees.addAll(liste);
    		fireIntervalAdded(this, 0, donnees.size());
    	}
     
    	public void ajouteTout(TreeSet<String> liste) 
    	{
    		donnees.addAll(liste);
    		fireIntervalAdded(this, 0, donnees.size());
    	}
     
    	public void retireTouteLaListe(List<String> liste) 
    	{
    		int ancienneTaille = donnees.size();
    		donnees.removeAll(liste);
    		fireIntervalRemoved(this, 0, ancienneTaille);
    	}
     
    	public void retireTout() 
    	{
    		int ancienneTaille = donnees.size();
    		donnees.clear();
    		fireIntervalRemoved(this, 0, ancienneTaille);
    	}
     
    	public void retire(int i) 
    	{
    		donnees.remove(i);
    		fireIntervalRemoved(this, i, i);
    	}
     
    	public List<String> getDonnees() 
    	{
    		return donnees;
    	}
     
    	public void setElementAt(int indice, String s) 
    	{
    		donnees.set(indice, s);
    		fireIntervalRemoved(this, indice, indice);
    	}
     
    	public void setListe(List<String> liste) 
    	{
    		donnees = new ArrayList<String>(liste);
    		fireIntervalAdded(this, 0, donnees.size());
    	}
     
    	public boolean contient(String s) 
    	{
    		return donnees.contains(s);
    	}
     
    	public void retireTouteLaListe(TreeSet<String> liste) 
    	{
    		int ancienneTaille = donnees.size();
    		donnees.removeAll(liste);
    		fireIntervalRemoved(this, 0, ancienneTaille);
    		}
    }
    Et enfin le programme en question
    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
     
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.Font;
    import java.awt.FontMetrics;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.FocusEvent;
    import java.awt.event.FocusListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.util.ArrayList;
    import java.util.List;
     
    import javax.swing.JFrame;
    import javax.swing.JInternalFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextField;
    import javax.swing.WindowConstants;
    import javax.swing.event.InternalFrameEvent;
    import javax.swing.event.InternalFrameListener;
    import javax.swing.event.ListSelectionEvent;
    import javax.swing.event.ListSelectionListener;
     
    import composants.listestring.ListeString;
     
    public class TexteFieldTest extends JTextField
    {
    	private static final long serialVersionUID = 1575785756013870194L;
    	private static Font police = new JTextField().getFont();
    	protected static FontMetrics fm = new JTextField().getFontMetrics(police);
    	static JInternalFrame lesPrenoms = new JInternalFrame("Les prénoms de référence");
    	static Object focus = null;
     
    	public static void main(String[] args)
    	{
    //              //avec SwingUtilities.invokeLater
    //		javax.swing.SwingUtilities.invokeLater(new Runnable()
    //		{
    //			@Override
    //			public void run()
    //			{
    //				JFrame fenetre = new JFrame();
    //				// fermeture du programme
    //				fenetre.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    //				// dimension en cas de redimensionnement
    //				fenetre.setSize(1200, 500);
    //
    //				JPanel panneau = new JPanel(new BorderLayout());
    //
    //				JPanel nord = new JPanel();
    //
    //				TexteFieldTest tft1 = new TexteFieldTest("Adam");
    //				TexteFieldTest tft2 = new TexteFieldTest("Eglantine");
    //				nord.add(tft1);
    //				nord.add(tft2);
    //
    //				panneau.add(nord, BorderLayout.NORTH);
    //				panneau.add(lesPrenoms, BorderLayout.SOUTH);
    //				fenetre.add(panneau);
    //				fenetre.pack();
    //				fenetre.setVisible(true);
    //			}
    //		});
     
                    //sans SwingUtilities
    		JFrame fenetre = new JFrame();
    		// fermeture du programme
    		fenetre.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    		// dimension en cas de redimensionnement
    		fenetre.setSize(1200, 500);
     
    		JPanel panneau = new JPanel(new BorderLayout());
     
    		JPanel nord = new JPanel();
     
    		TexteFieldTest tft1 = new TexteFieldTest("Adam");
    		TexteFieldTest tft2 = new TexteFieldTest("Eglantine");
    		nord.add(tft1);
    		nord.add(tft2);
     
    		panneau.add(nord, BorderLayout.NORTH);
    		panneau.add(lesPrenoms, BorderLayout.SOUTH);
    		fenetre.add(panneau);
    		fenetre.pack();
    		fenetre.setVisible(true);
    	}
     
    	public TexteFieldTest(String s)
    	{
    		super(s);
     
    		List<String> liste = new ArrayList<>();
    		for (String prenom : Outils.referents) liste.add(prenom);//il s'agit de récupérer une liste de prénoms, je joins le fichier texte correspondant
    		ListeString ls = new ListeString(liste);
     
    		Dimension d = getPreferredSize();
    		int w = s == null ? 0 : fm.stringWidth(s);
    		w = 2 + Math.max(d.width, w);
    		d = new Dimension(w, d.height);
    		setPreferredSize(d);
    		revalidate();
     
    		/**
                     * Les méthodes de MouseListener sont déclenchées dans l'ordre mouseEntered,
                     * mousePressed, mouseReleased, mouseClicked, mouseExited
                     */
    		addMouseListener(new MouseListener()
    		{
    			@Override
    			public void mouseClicked(MouseEvent e)
    			{
    				clic(e, liste, ls);
    			}
     
    			/**
                             * les deux procédures ci-dessous sont inutiles
                             *
                             * @param e un MouseEvent
                             */
    			@Override
    			public void mouseEntered(MouseEvent e)
    			{
    			}
     
    			@Override
    			public void mouseExited(MouseEvent e)
    			{
    			}
     
    			@Override
    			public void mousePressed(MouseEvent e)
    			{
    			}
     
    			@Override
    			public void mouseReleased(MouseEvent e)
    			{
    			}
    		});
     
     
    		lesPrenoms.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
    		lesPrenoms.setLayout(new BorderLayout());
     
    		// le JSP contenant la liste
    		JScrollPane jsp = new JScrollPane(ls);
    		// sa taille
    		jsp.setPreferredSize(new Dimension(200, 300));
     
    		lesPrenoms.add(jsp);
     
    		lesPrenoms.pack();
    		lesPrenoms.setVisible(true);
    	}
     
    	protected void clic(MouseEvent e, List<String> liste, ListeString ls)
    	{
    		System.out.println(e);
    		TexteFieldTest tft = (TexteFieldTest) e.getSource();
    		int n = tft.getCaretPosition();
    		if (n > 0) tft.getText().substring(0, n);
             	ls.retireTout();
                    //mes essais
    //		ls.repaint();
    //		ls.revalidate();
    //		lesPrenoms.repaint();
    //		lesPrenoms.revalidate();
    //		repaint();
    //		revalidate();
    	}
    }
    Normalement, après avoir cliqué dans un TexteFieldTest, la JInternalFrame lesPrenoms devraient présenter une liste vide, mais rien ne se passe.
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Réponses: 1
    Dernier message: 02/07/2009, 14h42
  2. mise à jour d'une JList
    Par master_och dans le forum Composants
    Réponses: 2
    Dernier message: 25/04/2009, 23h35
  3. Mise à jour d'une JTable en fonction d'une JList
    Par xtaZy dans le forum Composants
    Réponses: 1
    Dernier message: 21/03/2007, 18h25
  4. Mise à jour d'une table avec un fichier csv
    Par blackangel dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 26/05/2005, 14h46
  5. Mise à jour d'une bd mysql
    Par joquetino dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 11/01/2005, 14h05

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