Bonjour,
Je suis entrain de créer une interface dynamique en Java, c'est-à-dire que si on change les paramètres tous les éléments du JFrame changent aussi avec les événements.
Quelqu'un peut m'aider SVP!
Bonjour,
Je suis entrain de créer une interface dynamique en Java, c'est-à-dire que si on change les paramètres tous les éléments du JFrame changent aussi avec les événements.
Quelqu'un peut m'aider SVP!
Salut,
Bien sûr : ce forum est là pour aider tous ceux qui en ont besoin. Pose des questions précises et détaillées, et on verra si on peut te répondre.
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.
Oui mais là c'est carrément vague : c'est la description d'un peu près toutes les applications SWING qui se connectent à une base de données. Il va falloir être plus circonstancié. Quels problèmes rencontre-tu pour faire ça ? Où est la notion de dynamique ? As-tu besoin de générer 3000 formulaires automatiquement, ou tu as 3 objets dans ta base et tu veux faire trois formulaires qui s'affichent alternativement selon l'objet que tu veux modifier ou créer ? Tu cherches à faire quel type de présentation (en table, en arbre, etc.) ? Quelle est la dynamique générale de l'application (une simple frame avec tout en boutons, une frame avec des menus ou une frame muitidocument (internal frame)...
Si c'est simplement que te ne sais absolument pas comment faire d'interface SWING ou échanger avec un base de données, il faut te tourner vers des tutoriels. Voir en particulier JDBC pour l'aspect base de données.
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.
Le problème c'est que je n'arrive pas à vider les champs que j'ai créer dynamiquement avec un bouton nommé Reset
voici les codes :
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 package projet1; /** * @(#)Formulaire.java * * * * */ import javax.swing.JPanel; import javax.swing.BoxLayout; import javax.swing.JLabel; import java.awt.Dimension; import javax.swing.BorderFactory; import javax.swing.JComponent; import javax.swing.text.JTextComponent; public class Formulaire extends JPanel{ private String name; public Formulaire(String n) { setBorder(BorderFactory.createTitledBorder(name= n)); setLayout(new BoxLayout(this,BoxLayout.Y_AXIS)); } public Formulaire() { setBorder(BorderFactory.createEtchedBorder()); setLayout(new BoxLayout(this,BoxLayout.Y_AXIS)); } public void add(String label,String x,String[] strings,String obli){ add(new ZoneSesieEtiquete(label,x,strings,obli)); } public int synchronZones(){ int max = 0; for (int i = 0; i<getComponentCount(); i++) { int l = ((ZoneSesieEtiquete)this.getComponent(i)).getLabelText().length(); max = max>l?max:l; } for (int i = 0; i<getComponentCount(); i++) ((ZoneSesieEtiquete)this.getComponent(i)).setLabelPreferedSize(new Dimension(max*7,20)); return max; } public void setTextCompenentAt(JTextComponent t,int i){ if(i<getComponentCount()) ((ZoneSesieEtiquete)this.getComponent(i)).setTextComponent(t); } public void setLabelAt(JLabel l,int i){ if(i<getComponentCount()) ((ZoneSesieEtiquete)this.getComponent(i)).setlabel(l); } public void setLabelTextAt(String s,int i){ if(i<getComponentCount()) ((ZoneSesieEtiquete)this.getComponent(i)).setLabelText(s); } public String getLabelTextAt(int i){ return ((ZoneSesieEtiquete)this.getComponent(i)).getLabelText(); } public void setTextAt(String s,int i){ if(i<getComponentCount()) ((ZoneSesieEtiquete)this.getComponent(i)).settext(s); } public String getTextAt(int i){ return ((ZoneSesieEtiquete)this.getComponent(i)).getText(); } public String getTextAt(String s){ for (int i = 0; i<getComponentCount(); i++) if(((ZoneSesieEtiquete)this.getComponent(i)).getLabelText().equals(s))return getTextAt(i); return null; } public void setTextAt(String text,String labelName){ for (int i = 0; i<getComponentCount(); i++) if(((ZoneSesieEtiquete)this.getComponent(i)).getLabelText().equals(labelName)){ ((ZoneSesieEtiquete)getComponent(i)).settext(text); return; } } public String getTextAt(JLabel l){ for (int i = 0; i<getComponentCount(); i++) if(((ZoneSesieEtiquete)this.getComponent(i)).equals(l))return getTextAt(i); return null; } public void getTextAt(String text,JLabel l){ for (int i = 0; i<getComponentCount(); i++) if(((ZoneSesieEtiquete)this.getComponent(i)).equals(l)){ ((ZoneSesieEtiquete)getComponent(i)).settext(text); return; } } }
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
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323 package projet1; /** * @(#)ZoneSesieEtiquete.java * * * * */ import java.awt.Color; import javax.swing.JPanel; import javax.swing.JLabel; import javax.swing.JTextField; import javax.swing.text.JTextComponent; import java.awt.Dimension; import java.awt.FlowLayout; 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.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Stack; import java.util.regex.Pattern; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFormattedTextField; import javax.swing.JOptionPane; import javax.swing.event.MouseInputListener; public class ZoneSesieEtiquete extends JPanel implements KeyListener { public static JTextComponent text; public JLabel label; public JButton button; public static JTextField field; public static JFormattedTextField field1 = new JFormattedTextField(); public static JComboBox box; public Va vi = new Va(); public String l; String t; public static String ses; public static String co; private static final Pattern PATTERN_STRING = Pattern.compile("[0-9_(\\\\[,.;*%:!$£=+)°@µ|(())#&]\\\\*)?]+"); private static boolean isIntegerRegEx(String val) { return PATTERN_STRING.matcher(val).find(); } public ZoneSesieEtiquete() { } public ZoneSesieEtiquete(String l, String t, String[] v_combo, String obligatoire) { ((FlowLayout) getLayout()).setAlignment(0); if ("JTextField".equals(t)) { int i = 20; field = new JTextField(i); add(label = new JLabel(l)); add(new JLabel(": ")); add(text = field); field.setName(l); ses = field.getText(); field.setBackground(Color.white); TextEcout ctrlSaisie = new TextEcout(); // Définition du FocusListener qui sera attaché à la JTextField field.addFocusListener(ctrlSaisie); if ("Oui".equals(obligatoire)) { field.addKeyListener(this); Valid v = new Valid(); field.addFocusListener(v); } } if ("JFormattedTextField".equals(t)) { int i = 10; DateFormat format = new SimpleDateFormat("dd/MM/yyyy"); field1 = new JFormattedTextField(format); field1.setText("dd/MM/yyyy"); add(label = new JLabel(l)); add(new JLabel(": ")); add(text = field1); field1.setName(l); field1.setBackground(Color.white); TextEcout ctrlSaisie = new TextEcout(); // Définition du FocusListener qui sera attaché à la JTextField field1.addFocusListener(ctrlSaisie); if ("Oui".equals(obligatoire)) { field1.addKeyListener(this); Valid v = new Valid(); field1.addFocusListener(v); } } if ("JButton".equals(t)) { button = new JButton(l); button.addMouseListener(new MouseInputListener() { @Override public void mouseClicked(MouseEvent e) { ZoneSesieEtiquete.field.setText(null); ZoneSesieEtiquete.box.setSelectedItem(null); ZoneSesieEtiquete.field1.setText(null); ZoneSesieEtiquete.text.removeAll(); } @Override public void mousePressed(MouseEvent e) { // throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public void mouseReleased(MouseEvent e) { // throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public void mouseEntered(MouseEvent e) { // throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public void mouseExited(MouseEvent e) { // throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public void mouseDragged(MouseEvent e) { //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public void mouseMoved(MouseEvent e) { //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } }); add(button); } if ("JComboBox".equals(t)) { String[] tab = {"Option 1", "Option 2", "Option 3", "Option 4"}; box = new JComboBox(v_combo); add(label = new JLabel(l)); add(new JLabel(": ")); add(box); co = box.getSelectedItem().toString(); ComboxEve ctrlSaisie = new ComboxEve(); box.addFocusListener(ctrlSaisie); } } @Override public void keyTyped(KeyEvent e) { } @Override public void keyPressed(KeyEvent e) { } @Override public void keyReleased(KeyEvent e) { Object Donnees = e.getSource(); // On récupère l'objet appelant JTextField champ = (JTextField) Donnees; String teste = champ.getText(); if (isIntegerRegEx(teste) == true) { champ.setText(null); } else { String rec_nom = champ.getText().toUpperCase(); champ.setText(rec_nom); } } private class TextEcout implements FocusListener { @Override public void focusLost(FocusEvent e) { Object Donnees = e.getSource(); // On récupère l'objet appelant JTextField champ = (JTextField) Donnees; // On le caste en JTextField champ.setBackground(Color.white); e.setSource(champ); } @Override public void focusGained(FocusEvent e) { Object Donnees = e.getSource(); // On récupère l'objet appelant JTextField champ = (JTextField) Donnees; champ.setBackground(Color.yellow); e.setSource(champ); } } private class Valid implements FocusListener { @Override public void focusLost(FocusEvent e) { Object Donnees = e.getSource(); // On récupère l'objet appelant JTextField champ = (JTextField) Donnees; // On le caste en JTextField if ("".equals(champ.getText())) { JOptionPane.showMessageDialog(null, "Champ " + champ.getName() + " obligatoire"); } } @Override public void focusGained(FocusEvent e) { Object Donnees = e.getSource(); // On récupère l'objet appelant JTextField champ = (JTextField) Donnees; champ.setBackground(Color.yellow); e.setSource(champ); } } private class ComboxEve implements FocusListener { public void focusLost(FocusEvent e) { Object Donnees = e.getSource(); // On récupère l'objet appelant JComboBox champ = (JComboBox) Donnees; // On le caste en JTextField champ.setBackground(Color.white); e.setSource(champ); } public void focusGained(FocusEvent e) { Object Donnees = e.getSource(); // On récupère l'objet appelant JComboBox champ = (JComboBox) Donnees; // On le caste en JTextField champ.setBackground(Color.yellow); e.setSource(champ); } } public String getText() { return text.getText(); } public void settext(String s) { text.setText(s); } public String getLabelText() { return label.getText(); } public void setLabelText(String s) { label.setText(s); } public void setlabel(JLabel l) { remove(label); add(label = l, 0); } public void setTextComponent(JTextComponent t) { remove(text); add(text = t); } public void setLabelPreferedSize(Dimension d) { label.setPreferredSize(d); } public JButton getButton() { return button; } public void setButton(JButton button) { this.button = button; } public JTextField getField() { return field; } public void setField(JTextField field) { this.field = field; } public JLabel getLabel() { return label; } public void setLabel(JLabel label) { this.label = label; } public String getT() { return t; } public void setT(String t) { this.t = t; } public String getSes() { return ses; } public void setSes(String ses) { this.ses = ses; } }
Enfin :
Mon problème est ici ;quand je clique sur le bouton reset
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 package projet1; /** * @(#)TestFormulaire.java * * * * */ import connexion.ConnexionBase; import javax.swing.JFrame; import javax.swing.JPanel; import java.awt.FlowLayout; import java.sql.ResultSet; import java.sql.Statement; import java.util.ArrayList; import java.util.Stack; import javax.swing.JButton; import javax.swing.JTextField; public class TestFormulaire extends JFrame { private Formulaire f; public TestFormulaire() { setTitle("Formulaire Personnnel"); f = new Formulaire(); //Reccupération dans la base try { Statement st = ConnexionBase.getInstance().createStatement(); ResultSet result1 = st.executeQuery("SELECT * FROM champs order by num"); while (result1.next()) { String lib = result1.getString("libelle"); String ty = result1.getString("type"); String li = result1.getString("num"); int lo = result1.getInt("longueur"); String ca = result1.getString("cases"); String ob = result1.getString("obligatoire"); //Sous Requête ArrayList al = new ArrayList(); al = Reccupcontenu(lib); String[] mylist = new String[al.size()]; mylist = (String[]) al.toArray(mylist); f.add(lib, ty, mylist, ob); } } catch (Exception e) { System.out.println(e); } //Boucle pour afficher les Jlabel et le JTexField // f.add("charif", 15); /* f.add("c",15); f.add("charifkjbhkdjshkjhskj",15); f.add("cha",15); f.add("rdem",50); f.synchronZones();*/ /* f.setTextAt("howa",0); f.setTextAt("hadak","c"); f.setTextAt(f.getTextAt(f.getLabelTextAt(0)),f.getLabelTextAt(2)); */ ((JPanel) getContentPane()).setLayout(new FlowLayout()); ((JPanel) getContentPane()).add(f); pack(); setDefaultCloseOperation(DISPOSE_ON_CLOSE); setResizable(false); setVisible(true); } public static ArrayList<String> Reccupcontenu(String f) { ArrayList<String> str = new ArrayList<String>(); try { Statement st2 = ConnexionBase.getInstance().createStatement(); ResultSet result2 = st2.executeQuery("SELECT contenu FROM liste where libelle='" + f + "'"); int i = 0; while (result2.next()) { String x = result2.getString("contenu"); str.add(x); } } catch (Exception e) { } return str; } /** * @param args the command line arguments */ public static void main(String[] args) { new TestFormulaire(); } }
seulement le dernier champ sera vider; alors que je veux tout les champs créer dynamiquement à partir du boucle serons vider aussi
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 ... button = new JButton(l); button.addMouseListener(new MouseInputListener() { @Override public void mouseClicked(MouseEvent e) { ZoneSesieEtiquete.field.setText(null); ZoneSesieEtiquete.box.setSelectedItem(null); ZoneSesieEtiquete.field1.setText(null); } ... add(button);
Je vois :
- Déjà, ne pas utiliser de champs static : ils sont partagés entre toutes les instances (si tu as 2 zonesaisies qui ont un JTextField, c'est le même (alors peut-être qu'au moment de la création de l'interface tu en mettras bien 2 différents dans la fenêtre, mais à la sauvegarde, ce n'a n'en sera plus qu'un et tu sauvegarderas la même information dans 2 champs
- N'utilise pas de champs public : ça te semble plus pratique pour faire les manipulations, mais ça te limite pour le modèle objet et ça favorise les erreurs de manipulation
Je ne vais pas tout reprendre ce que tu as fait mais vais te donner un exemple simplifié pour te donner le principe. Donc, je résume ce que tu veux faire : tu veux pouvoir générer dynamiquement des formulaires pour modifier tes objets. Pour cela tu as fait une classe qui représente un champ standard, qui te permet de gérer plusieurs types de champs.
2 approches possibles :
- La tienne, qui consiste à avoir une seule classe ZoneSaisieEtiquette, avec un ou plusieurs constructeurs, pour créer des champs différents (avec JTextField, combo, etc)
C'est une façon de faire. Mais pour la sauvegarde, ajoute une méthode qui fait la sauvegarde, en fonction des paramètres de la classe.
Un formulaire sera en gros une liste de ZoneSaisieEdiquette, que tu n'auras qu'à parcourir en appelant à chaque fois la méthode de sauvegarde, pour faire la sauvegarde globale- L'autre solution est de faire une arborescence de classe, avec une classe abstraite qui contient tout le standard d'un ZoneSaisieEtiquette quelqocnque, sans se préoccuper du type de champs, et une implémentation concrète par type de champ, ce qui te permet d'être beaucoup plus générique et souple
La sauvegarde se fait sur le même principe que la 1)
Je peux te faire un exemple simplifiée si tu ne visualises pas concrètement ce que je veux dire.
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.
Je ne connais pas vraiment de tutoriels sur le sujet. Je te ferais un petit exemple plus tard.
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.
La classe qui représente un champ (pour toi ZoneSesieEtiquete), doit avoir les méthodes qui permettent par un simple appel de l'extérieur de faire ce qu'elles doivent faire : on accède pas directement aux attributs des objets. Et ces attributs ne doivent pas être static, pour qu'ils aient une valeur pour chaque instance de ZoneSesieEtiquete.
Ensuite dans le constructeur, tu remplis les variables utiles en fonction des paramètres comme tu fais ici :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 public class ZoneSesieEtiquete extends JPanel implements KeyListener { public JTextComponent text; public JLabel label; public JButton button; public JTextField field; public JFormattedTextField field1 public JComboBox box; public Va vi = new Va(); public String l;
chaque instance de ZoneSesieEtiquete aura donc uniquement les attributs utiles (field aura une valeur lorsque t vaudra "JTextField", box aura une valeur lorsque t vaudra "JComboBox".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 public ZoneSesieEtiquete(String l, String t, String[] v_combo, String obligatoire) { ((FlowLayout) getLayout()).setAlignment(0); if ("JTextField".equals(t)) { int i = 20; field = new JTextField(i); ...
Ensuite, dans la classe ZoneSesieEtiquete, tu peux ajouter des méthodes dont le but est de faire un traitement particulier sur la champ, quelque soit le champ, sans que le code qui appelle cette méthode ait besoin de savoir comment est fait le champ.
Pour pouvoir le faire plus facilement, il va falloir sauvegarde t dans une variable de la classe :
Ensuite tu peux faire toutes les méthodes que tu veux qui vont en fonction de typeDeChamp faire le traitement adéquate. Par exemple, pour remettre à zéro les champs, on peut faire une méthode resetValeur() :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 ... private String typeDeChamp; public ZoneSesieEtiquete(String l, String t, String[] v_combo, String obligatoire) { typeDeChamp = t; ((FlowLayout) getLayout()).setAlignment(0); if ("JTextField".equals(t)) { int i = 20; field = new JTextField(i); ...
Il suffit de boucler sur la liste de toutes les instances de ZoneSesiEtiquette dans le formulaire et d'appeler la méthode resetValeur(), et tous les champs se vident.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 public void resetValeur() { if ( "JTextField".equals(typeDeChamp) ) { field.setText(""); } else if ( "JComboBox".equals(typeDeChamp) ) { box.setSelectedItem( box.getModel().getElementAt(0) ) ; // par exemple } else ... }
Bien sûr, pour ça, il faut avoir la liste des composants ZoneSaisiEtiquette : soit tu utilises les méthodes standard, comme getComponents() et tu testes si c'est un ZoneSesiEtiquette :
Tu pourrais aussi stocker tous les ZoneSesiEtiquette dans une liste à part (List<ZoneSesiEtiquette>), au moment où tu les ajoutes au Formulaire, et ne parcourir que cette liste
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 public void resetAllValues() { for(Component component : getComponents()) { if ( component instanceof ZoneSesiEtiquete ) { ((ZoneSesiEtiquete)component).resetValue(); } } }
Pour mettre une valeur dans chaque champ, c'est pareil : pas besoin de faire une méthode setxxx pour chaque cas, une seule méthode suffit :
Pour écrire des valeurs, tu lis ces valeurs dans une base à priori, et on ne peut pas faire de boucle : il faut pouvoir repérer dans quel champ va tel valeur. Soit tu te bases sur l'ordre d'ajout : le champ numéro 1 va dans le premier champ de la liste, soit mieux tu ajoutes une notion d'identifiant à chaque champ (chaque instance de ZoneSesiEtiquete) :l'identifiant peut être par exemple le nom de la colonne dans la base. Et tu utilises une map pour stocker les ZoneSesiEtiquete associée à leur identifant, ce qui te permet de les retrouver par cet identifiant, sans avoir à tout parcourir et à tester :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 public void setValeur(String valeur) { if ( "JTextField".equals(typeDeChamp) ) { field.setText( valeur ); } else if ( "JComboBox".equals(typeDeChamp) ) { box.setSelectedItem( valeur ) ; } }
Dans Formulaire, on pourra avoir une méthode :
Pour lire des valeurs dans le formulaire pour les remettre dans la base, ce sera le même principe.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 public void setValeur(String identifiantChamp, String valeur) { map.get( identifiantChamp ).setValeur( valeur ); }
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.
merci beaucoup;
ok; je veux le faire
J'ai déjà essaié mais
ça marche pas encore
j'ai suivi tes codes
Peut être l'erreur vient de ce code
TestFormulaire.java
Classe ZoneSesieEtiquete.java
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 public class TestFormulaire extends JFrame { private JPanel f; ... Boucle{ String jLabel = //Nom du JLabel String type = //Type du champs String obl = // ... //J'appel au constructeur dans ZoneSesieEtiquete ZoneSesieEtiquete etiquet = new ZoneSesieEtiquete(jLabel, type,obl); f.add(etiquet ); } ((JPanel) getContentPane()).setLayout(new FlowLayout()); ((JPanel) getContentPane()).add(f); pack(); setDefaultCloseOperation(DISPOSE_ON_CLOSE); setResizable(false); setVisible(true); ....
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 public class ZoneSesieEtiquete extends JPanel implements KeyListener { public JTextComponent text; public JLabel label; public JButton button; public JTextField field; public JFormattedTextField field1; public JComboBox box; ... public ZoneSesieEtiquete(String l, String t, String[] v_combo, String obligatoire) { typeDeChamp = t; ((FlowLayout) getLayout()).setAlignment(0); if ("JTextField".equals(t)) { .... if ("JButton".equals(t)) { //j'ai crée un événement sur le bouton pour vider les champs ... button.addMouseListener(new MouseInputListener() { @Override public void mouseClicked(MouseEvent e) { //J'ai appelé la methode resetAllValues resetAllValues(); }
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 public void resetValeur() { if ("JTextField".equals(typeDeChamp)) { field.setText("cebanne"); } if ("JComboBox".equals(typeDeChamp)) { box.setSelectedItem(box.getModel().getElementAt(0)); // par exemple } el if ("JFormattedTextField".equals(typeDeChamp)) { field1.setText("michel"); } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 public void resetAllValues() { for (Component component : getComponents()) { if (component instanceof ZoneSesieEtiquete) { ((ZoneSesieEtiquete) component).resetValeur(); } } }
Salut,
Si tu peux appeler directement resetAllValues(), c'est que tu as dû mettre cette méthode dans la classe ZoneSesiEtiquette. La liste de composants parcourus par la méthode resetAllValues doit celle des composants du panel où sont ajoutés les ZoneSesieEtiquette, c'est-à-dire l'instance pointée par la variable f de ton premier code.
Ici, tu créés le bouton par un ZoneSesieEtiquette avec un paramètre "JButton" : du coup, l'ActionListener que tu ajoutes à ce bouton récupère la liste des composants à l'intérieur du ZoneSesieEtiquette de type JButton, qui ne contient pas de ZoneSesieEtiquette.
Si tu veux ou doit gérer les boutons de cette manière (parce que je les gèrerais personnellement complètement à part (pas comme des ZoneSesiEtiquette), et que tous les ZoneSesieEtiquette sont dans le même JPanel, tu peux accèder au parent du ZoneSesieEtiquette :
et (dans ZoneSesieEtiquette)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 public ZoneSesieEtiquete(String l, String t, String[] v_combo, String obligatoire) { typeDeChamp = t; ((FlowLayout) getLayout()).setAlignment(0); if ("JTextField".equals(t)) { .... if ("JButton".equals(t)) { button=new JButton(l); button.addActionListener(e-> resetAllValues()); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 public void resetAllValues() { for (Component component : getParent().getComponents()) { if (component instanceof ZoneSesieEtiquete) { ((ZoneSesieEtiquete) component).resetValeur(); } }
On sent poindre les limites de ton système à base de classe unique, et de parcourt de de méthodes de base de SWING. Tout ceci serait bien plus facilement gérable avec une hierarchie de classes, qui permettrait des paramètres spécifiques pour chaque classe de "zone de saisie", et une classe de formulaire qui maintient une liste des composants de saisie, voire une map (avec un notion d'identifiant). Ainsi, on pourrait passer directement un ActionListener pour créer les boutons, ce qui permettrait beaucoup plus de liberté. Là, on voit bien dans le if suivant qu'on est hyper contraint :
Eventuellement, tu peux t'en sortir en faisant un second constructeur à ZoneSesieEtiquete du type :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 if ("JButton".equals(t)) { button=new JButton(l); button.addActionListener(e-> resetAllValues()); }
Et pour construire le ZoneSesieEtiquette, dans Formulaire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 public ZoneSesieEtiquete(String textButton, ActionListener actionListener) { button=new JButton(textButton); button.addActionListener(actionListener); ... }
Avec resetAllValues dans la classe Formulaire également :
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 Boucle{ String jLabel = //Nom du JLabel String type = //Type du champs String obl = // ... //J'appel au constructeur dans ZoneSesieEtiquete ZoneSesieEtiquete etiquet; if ( type.equals("JButton") ) { ActionListener actionListener; if ( je sais pas quoi ) { actionListener = e-> resetAllValues(); } etiquet = new ZoneSesieEtiquete(jLabel, actionListener); } else { etiquet = new ZoneSesieEtiquete(jLabel, type,obl); } etiquettes.add(etiquet); f.add(etiquet ); }
et etiquettes, une variable de la classe Formulaire, de type List<ZoneSesiEtiquettes>
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 public void resetAllValues() { for (ZoneSesieEtiquete etiquette : etiquettes) { etiquette.resetValeur(); } }
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.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager