IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants Java Discussion :

[Résolu] Problème sur un JTable


Sujet :

Composants Java

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Loisir
    Inscrit en
    mars 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Loisir

    Informations forums :
    Inscription : mars 2020
    Messages : 2
    Points : 1
    Points
    1
    Par défaut [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 : 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)
    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 : 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;
        }
    }
    - 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
    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 : 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;
                }
            }
        }
    }
    Je vous remercie d'avance pour votre aide pour trouver ce qui cloche dans mon code.

    Cordialement,
    Laurent

  2. #2
    Nouveau Candidat au Club
    Homme Profil pro
    Loisir
    Inscrit en
    mars 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Loisir

    Informations forums :
    Inscription : mars 2020
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    J'ai trouvé l'origine de mon problème. Il ne venait absolument pas ni de mon modèle ni de la gestion de mes listes.
    Après relecture intensive de tout mon code, j'ai trouvé l'origine du problème. C'était une erreur tout bête. J'ai initialisé mon tableau en static

Discussions similaires

  1. Problème erreur exception sur affichage JTable
    Par Chafiq Qassim dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 20/03/2020, 17h11
  2. Problème de mise à jour sur ma JTable
    Par sam14 dans le forum Débuter
    Réponses: 1
    Dernier message: 23/03/2012, 13h08
  3. Problème sur JTable
    Par arsenik7 dans le forum Composants
    Réponses: 4
    Dernier message: 03/07/2006, 16h42
  4. Problème sur une requête INSERT
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/06/2003, 08h45
  5. problème sur une requête!!!!!
    Par Mcgrady_01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/06/2003, 01h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo