Bonjour,
Nous utilisons à mon travail Excel pour gérer notre base de produits chimiques. Le fichier répond à nos attentes mais présente quelques limites tels que l'affichage des structures chimiques. Par conséquent, j'essaie de développer un petit logiciel en java pour gérer une base de produits chimique. Je ne suis pas développeur mais j'ai quelques notions en java et ce projet me permettra à apprendre et m'améliorer en java. Jusqu'ici, je n'avais pas rencontré de gros problèmes pour réaliser ce logiciel.
Aujourd'hui, je suis confronté à un problème avec la gestion de mes tableaux. J'utilise un JTable associé à un AbstractModelTable pour afficher les données des produits. Mon code fonctionne très bien lorsque j'affiche un seul tableau mais lorsque j'affiche un deuxième tableau, mon premier tableau est tjs affiché mais les actions que je réalise dessus me soulève cette erreur :
J'utilise les 3 mêmes classes pour construire les tableaux. Mon but est de pouvoir afficher un tableau avec tous les produits contenus dans la base et un tableau avec des paramètres de sélection tels que leur localisation. A la lecture des erreurs, j'ai le sentiment que ce problème viendrait de mes données collectées dans mon ArrayList. Comme si l'instanciation de mon nouveau tableau vidait le premier ArrayList. Mais n'étant pas développeur et ayant des connaissances limitées en java, je ne suis sur de rien. Ce sont les raisons pour lesquelles, je vous demande de l'aide.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Invalid index at javax.swing.DefaultRowSorter.convertRowIndexToModel(Unknown Source) at javax.swing.JTable.convertRowIndexToModel(Unknown Source) at javax.swing.JTable.getValueAt(Unknown Source) at jdbp.gui.windows.ProductWindow.displayProduct(ProductWindow.java:721) at jdbp.gui.windows.ProductWindow.access$2(ProductWindow.java:718) at jdbp.gui.windows.ProductWindow$1.mouseClicked(ProductWindow.java:666) at java.awt.AWTEventMulticaster.mouseClicked(Unknown Source)
Je poste les 3 classes que j'utilise pour construire mes tableaux.
- Ma première classe me sert à récupérer les données à afficher dans le tableau
- La deuxième sert à créer le tableau
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 package jdbp.gui.table.product; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import jdbp.datatables.sql.ProductDataTable; import jdbp.utils.product.Product; public class ProductList { // Déclarer l'ArrayList qui contiendra les fiches produits private ArrayList<Product> productList; // Récupérer le HashMap contenant toutes les fiches produits private HashMap<Integer, Product> productDatabase = ProductDataTable.getProductData(); public ProductList() { productList = new ArrayList<Product>(); } public void addAllProduct() { // Initialiser un Iterator pour parcourir le HashMap Iterator<Integer> i = productDatabase.keySet().iterator(); // Boucler sur l'Iterator pour récupérer les données while (i.hasNext()) { int key = i.next(); Product product = productDatabase.get(key); productList.add(product); } } public void addSelectedProduct(String location, String subLocation, String container) { // Initialiser un Iterator pour parcourir le HashMap Iterator<Integer> i = productDatabase.keySet().iterator(); // Boucler sur l'Iterator pour récupérer les données while (i.hasNext()) { int key = i.next(); Product product = productDatabase.get(key); // Ajouter les produits si et seulement si, ils répondent aux critères définis if(product.getLocation().equals(location) && product.getSubLocation().equals(subLocation) && product.getContainer().equals(container)) { productList.add(product); } } } public ArrayList<Product> getProductList() { return productList; } }
- Et la dernière sert pour mon 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 package jdbp.gui.table.product; import java.awt.Dimension; import java.awt.Toolkit; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import javax.swing.JLabel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableCellRenderer; import jdbp.datatables.sql.ProductDataTable; import jdbp.utils.product.Product; public class ProductTable extends JScrollPane { private static final long serialVersionUID = -1987021598163839971L; // Créer le tableau de résultats JTable dataTable = new JTable(); public ProductTable(ProductTemplate template) { super(); // Affecter un Renderer pour le tableau rendererTable(template); // Afficher le tableau des produits dans la fenêtre this.setViewportView(dataTable); } private void rendererTable(ProductTemplate template) { // Adjuster la taille de l'écran Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); // Adapter l'écran à la fenêtre dataTable.setPreferredScrollableViewportSize(screen); // Affecter le template dataTable.setModel(template); // Interdire le drag & drop dataTable.getTableHeader().setReorderingAllowed(false); // Définir la hauteur de ligne dataTable.setRowHeight(25); // Définir la largeur min/max des colonnes "Row" et "MSDS" dataTable.getColumnModel().getColumn(ProductTemplate.ROW).setMinWidth(30); dataTable.getColumnModel().getColumn(ProductTemplate.ROW).setMaxWidth(30); // Créer un triage auto des lignes dataTable.setAutoCreateRowSorter(true); // Centrer l'entête ((DefaultTableCellRenderer) dataTable.getTableHeader().getDefaultRenderer()).setHorizontalAlignment(JLabel.CENTER); // Centrer le contenu du tableau de résultat DefaultTableCellRenderer renderer = new DefaultTableCellRenderer(); renderer.setHorizontalAlignment(JLabel.CENTER); for (int i = 0; i < dataTable.getColumnCount(); i++) { if (i != 1) { dataTable.getColumnModel().getColumn(i).setCellRenderer(renderer); } } } }
Je vous remercie d'avance pour votre aide pour trouver ce qui cloche dans mon 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
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 package jdbp.gui.table.product; import java.util.ArrayList; import javax.swing.table.AbstractTableModel; import jdbp.utils.others.CasFormat; import jdbp.utils.product.Product; import jdbp.utils.product.ProductBatch; public class ProductTemplate extends AbstractTableModel { private static final long serialVersionUID = 5431095500335098226L; private boolean isAllProduct; private final String[] entetes = { "", "Nom", "CAS", "Code", "Emplacement", "Localisation", "Nombre de lot" }; private ArrayList<Product> listProduct = new ArrayList<Product>(); public static final int ROW = 0; public static final int NAME = 1; public static final int CAS = 2; public static final int CODE = 3; public static final int LOCATION = 4; public static final int SUBLOCATION = 5; public static final int BATCHES = 6; public ProductTemplate(ArrayList<Product> listProduct, boolean isAllProduct) { super(); this.listProduct = listProduct; this.isAllProduct = isAllProduct; } @Override public int getColumnCount() { return entetes.length; } @Override public String getColumnName(int columnIndex) { return entetes[columnIndex]; } @Override public int getRowCount() { return listProduct.size(); } @Override public Object getValueAt(int rowIndex, int columnIndex) { switch(columnIndex) { case ROW: { return rowIndex + 1; } case NAME: { return listProduct.get(rowIndex).getName(); } case CAS: { return CasFormat.setCasToString(listProduct.get(rowIndex).getCAS()); } case CODE: { return listProduct.get(rowIndex).getContainer() + " 0" + listProduct.get(rowIndex).getContainerId(); } case LOCATION: { return listProduct.get(rowIndex).getLocation(); } case SUBLOCATION: { return listProduct.get(rowIndex).getSubLocation(); } case BATCHES: { int count = 0; String location = listProduct.get(rowIndex).getLocation(); String subLocation = listProduct.get(rowIndex).getSubLocation(); String container = listProduct.get(rowIndex).getContainer(); // Get batches listing ArrayList<ProductBatch> pBatchList = new ArrayList<ProductBatch>(); pBatchList = listProduct.get(rowIndex).getBatch(); if (pBatchList != null) { // Load the number of batches if (!isAllProduct) { count = pBatchList.size(); } else { for (int i = 0; i < pBatchList.size(); i++) { ProductBatch pBatch = new ProductBatch(); pBatch = pBatchList.get(i); if (pBatch.getLocation().equals(location) && pBatch.getSubLocation().equals(subLocation) && pBatch.getContainer().equals(container)) { count++; } } } } return count; } default: { throw new IllegalArgumentException(); } } } @Override public Class<?> getColumnClass(int columnIndex) { switch (columnIndex) { case ROW: case NAME: case CAS: case CODE: case LOCATION: case SUBLOCATION: { return String.class; } case BATCHES: { return Integer.class; } default: { return Object.class; } } } }
Cordialement,
Laurent
Partager