[Résolu] Problème sur un JTable
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 :
Code:
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) |
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.
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
Code:
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;
}
} |
- La deuxième sert à créer le tableau
Code:
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);
}
}
}
} |
- Et la dernière sert pour mon modèle
Code:
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;
}
}
}
} |
Je vous remercie d'avance pour votre aide pour trouver ce qui cloche dans mon code.
Cordialement,
Laurent