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
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
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); } }
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 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); } }
Normalement, après avoir cliqué dans un TexteFieldTest, la JInternalFrame lesPrenoms devraient présenter une liste vide, mais rien ne se passe.
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(); } }
Partager