salut
je développe un programme de gestion d'envoi de SMS.
j'ai un problème que j'ai résolu mais que partiellement, cad d'une manière qui ne me satisfait pas.
je m'explique : le programme gère une liste de rendez-vous de patients, et cette liste se retrouve en 2 endroits,
1.dans un modèle de JTable
2.dans une base derby.
à un certain moment je veux supprimer les rdv (1 RDV => 1 SMS) qui sont périmés.
donc je fais une première boucle pour récolter les RDV (il y a une class RDV) qui sont trop vieux puis je fais une deuxième boucle pour supprimer les rdv les rdv récoltés.
je dois faire deux passes car sinon je serais dans une configuration où je supprime des éléments d'une collection que je parcours, donc il y aurait un conflit.
mais voici le code, ça sera peut-être plus clair :
ceci ne marche PAS si j'enlève la ligne du thread.sleep.
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 System.out.println("loop_horaire / suppression vieux RDV de AL locale"); /* * 1.suppression vieux RDV de ALLocale */ Locale locale = Locale.getDefault(); DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.FULL, locale); Liste_rdv_minimum rdv_a_supp = new Liste_rdv_minimum(); for (RDV rdv : Fenetre.al_locale.rdvs) { Calendar cal_rdv = Calendar.getInstance(); cal_rdv.set(Calendar.YEAR, (rdv.DATEXA.getYear() + 1900)); cal_rdv.set(Calendar.MONTH, rdv.DATEXA.getMonth()); cal_rdv.set(Calendar.DAY_OF_MONTH, rdv.DATEXA.getDate()); cal_rdv.set(Calendar.HOUR_OF_DAY, rdv.getDATEXA().getHours()); cal_rdv.set(Calendar.MINUTE, rdv.DATEXA.getMinutes()); Calendar cal_limite = Calendar.getInstance(); cal_limite.setTime(new Date()); cal_limite.add(Calendar.DATE, -7); System.out.println("vieillesse : " + rdv.getNAME() + " / " + dateFormat.format(cal_rdv.getTime())); // limite non stricte : un RDV de la même date que celle de la // limite est gardé if (cal_rdv.before(cal_limite)) { // System.out.println("suppression pour vieillesse de " + // rdv.NAME // + " / " + rdv.NUMRDV + " / " // + dateFormat.format(cal_rdv.getTime()) // + " alors que limite = " // + dateFormat.format(cal_limite.getTime())); rdv_a_supp.addRow(rdv); } } for (RDV rdv2 : rdv_a_supp.rdvs) { Fenetre.al_locale.delete_rdv_in_base(rdv2); Fenetre.al_locale.removeRow(rdv2); try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
j'obtient alors :
- un affichage de la JTable où une ligne manque (et il n'y a pas de décalage vers le haut des lignes restantes)
- une erreur :
j'ai eu l'idée du thread.sleep en utilisant le débogueur d' eclipse, je me suis rendu compte que le programme marchait alors, et que une différence était qu'il y avait du temps entre les différentes instructions.
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 debut delete_rdv_in_base, RDV : LEM/num rdv=RHCXD24/date tel=Wed Dec 14 00:00:00 CET 2011 delete from rdv where NUMRDV='RHCXD24' Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2 at java.util.ArrayList.rangeCheck(ArrayList.java:604) at java.util.ArrayList.get(ArrayList.java:382) at metier.Liste_rdv_minimum.getValueAt(Liste_rdv_minimum.java:49) at javax.swing.JTable.getValueAt(JTable.java:2720) at javax.swing.JTable.prepareRenderer(JTable.java:5718) at org.jvnet.substance.SubstanceTableUI.paintCell(SubstanceTableUI.java:912) at org.jvnet.substance.SubstanceTableUI.paintCells(SubstanceTableUI.java:661) at org.jvnet.substance.SubstanceTableUI.paint(SubstanceTableUI.java:545) at org.jvnet.substance.SubstanceTableUI.__org__jvnet__substance__SubstanceTableUI__update(SubstanceTableUI.java:2442) at org.jvnet.substance.SubstanceTableUI.update(SubstanceTableUI.java) at javax.swing.JComponent.paintComponent(JComponent.java:778) at javax.swing.JComponent.paint(JComponent.java:1054) at javax.swing.JComponent.paintChildren(JComponent.java:887) at javax.swing.JComponent.paint(JComponent.java:1063) at javax.swing.JViewport.paint(JViewport.java:725) at javax.swing.JComponent.paintChildren(JComponent.java:887) at javax.swing.JComponent.paint(JComponent.java:1063) at javax.swing.JComponent.paintToOffscreen(JComponent.java:5221) at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:295) at javax.swing.RepaintManager.paint(RepaintManager.java:1206) at javax.swing.JComponent._paintImmediately(JComponent.java:5169) at javax.swing.JComponent.paintImmediately(JComponent.java:4980) at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:770) at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:728) at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:677) at javax.swing.RepaintManager.access$700(RepaintManager.java:59) at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1621) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705) at java.awt.EventQueue.access$000(EventQueue.java:101) at java.awt.EventQueue$3.run(EventQueue.java:666) at java.awt.EventQueue$3.run(EventQueue.java:664) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) at java.awt.EventQueue.dispatchEvent(EventQueue.java:675) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105) at java.awt.EventDispatchThread.run(EventDispatchThread.java:90) fin delete_rdv_in_base debut delete_rdv_in_base, RDV : DICK/num rdv=DCFF9H/date tel=Sun Dec 18 00:00:00 CET 2011 delete from rdv where NUMRDV='DCFF9H' Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1 at java.util.ArrayList.rangeCheck(ArrayList.java:604) at java.util.ArrayList.get(ArrayList.java:382) at metier.Liste_rdv_minimum.getValueAt(Liste_rdv_minimum.java:49) at javax.swing.JTable.getValueAt(JTable.java:2720) at javax.swing.JTable.prepareRenderer(JTable.java:5718) at org.jvnet.substance.SubstanceTableUI.paintCell(SubstanceTableUI.java:912) at org.jvnet.substance.SubstanceTableUI.paintCells(SubstanceTableUI.java:661) at org.jvnet.substance.SubstanceTableUI.paint(SubstanceTableUI.java:545) at org.jvnet.substance.SubstanceTableUI.__org__jvnet__substance__SubstanceTableUI__update(SubstanceTableUI.java:2442) at org.jvnet.substance.SubstanceTableUI.update(SubstanceTableUI.java) at javax.swing.JComponent.paintComponent(JComponent.java:778) at javax.swing.JComponent.paint(JComponent.java:1054) at javax.swing.JComponent.paintChildren(JComponent.java:887) at javax.swing.JComponent.paint(JComponent.java:1063) at javax.swing.JViewport.paint(JViewport.java:725) at javax.swing.JComponent.paintChildren(JComponent.java:887) at javax.swing.JComponent.paint(JComponent.java:1063)fin delete_rdv_in_base loop_horaire / creation ALatraiter loop_horaire / envoi des non envoyes deja passes loop_horaire / demande de nvo statut pouyr les message deja envoyes de statuyt incertain exiting loop_horaire at javax.swing.JComponent.paintToOffscreen(JComponent.java:5221) at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:295) at javax.swing.RepaintManager.paint(RepaintManager.java:1206) at javax.swing.JComponent._paintImmediately(JComponent.java:5169) at javax.swing.JComponent.paintImmediately(JComponent.java:4980) at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:770) at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:728) at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:677) at javax.swing.RepaintManager.access$700(RepaintManager.java:59) at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1621) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705) at java.awt.EventQueue.access$000(EventQueue.java:101) at java.awt.EventQueue$3.run(EventQueue.java:666) at java.awt.EventQueue$3.run(EventQueue.java:664) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) at java.awt.EventQueue.dispatchEvent(EventQueue.java:675) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105) at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
le problème c'est que mon programme a pour but de traiter des milliers de lignes, et voilà donc le problème : il deviendra trop lent lorsqu'il y aura beaucoup de lignes.
savez-vous comment résoudre ce problème, sachant que les 2 lignes en cause
(delete_rdv_in_base et remove_row ne devraient pas à priori traiter des éléments différents?
voici enfin les 2 méthodes :
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
17
18
19
20
21
22
23
24
25
26
27 public void delete_rdv_in_base(RDV rdv) { System.out.println("debut delete_rdv_in_base, RDV : " + rdv.NAME + "/num rdv=" + rdv.NUMRDV + "/date tel=" + rdv.DATTEL); Statement stmt; try { String sql = "delete from rdv where NUMRDV='" + rdv.getNUMRDV() + "'"; System.out.println(sql); stmt = connexion.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); stmt.executeUpdate(sql); } catch (SQLException e) { System.out.println("e7 : " + e); try { // con_to_derby.close(); } catch (Exception ex) { System.out.println("err1" + ex); } } System.out.println("fin delete_rdv_in_base"); }
dites-moi si vous voulez plus d'infos.
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 void removeRow(int i) { rdvs.remove(i); // fireTableRowsDeleted(i, i); fireTableDataChanged(); } public void removeRow(RDV rdv) { removeRow(rdvs.indexOf(rdv)); fireTableDataChanged(); }
merci,
olivier
bonne année 2012!
Partager