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 :

Problèmes concernant une JTable


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Novembre 2010
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 273
    Par défaut Problèmes concernant une JTable
    Bonjour,

    J'ai une JTable qui contient dans la derniere colonne plusieurs JPanel. Chaque JPanel contient 2 JButton.
    Tout s'affiche comme souhaité, mais on ne peut plus interagir avec les bouttons comme c'était le cas quand ils étaient en-dehors de la JTable.

    Un peu de 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
    // ma classe qui est en fait mon panneau principal
    public class PanneauAccess extends JPanel {
     
        // constructeur
        public PanneauAccess() {
            super(new GridLayout(0, 1));
     
             //Les titres des colonnes
             String  title[] = {"", "Number", "Date", "Status", "Qty", "Price", 
                    "Supplier", ""};
     
         // panneaux de navigation
     
            JPanel panneauSIB = new JPanel(new FlowLayout());
            panneauSIB.add(precedentCdeSIB);
            panneauSIB.add(suivantCdeSIB);
            panneauSIB.add(nbCdeSIB);
            panneauSIB.add(new JLabel("/"));
            panneauSIB.add(nbTotCdeSIB);
     
            JPanel paneauLSC = new JPanel(new FlowLayout());
            paneauLSC.add(precedentCdeLSC);
            paneauLSC.add(suivantCdeLSC);
            paneauLSC.add(nbCdeLSC);
            paneauLSC.add(new JLabel("/"));
            paneauLSC.add(nbTotCdeLSC);
     
            JPanel paneauAG = new JPanel(new FlowLayout());
            paneauAG.add(precedentCdeAG);
            paneauAG.add(suivantCdeAG);
            paneauAG.add(nbCdeAG);
            paneauAG.add(new JLabel("/"));
            paneauAG.add(nbTotCdeAG);
     
            JPanel paneauMims = new JPanel(new FlowLayout());
            paneauMims.add(precedentCdeMims);
            paneauMims.add(suivantCdeMims);
            paneauMims.add(nbMims);
            paneauMims.add(new JLabel("/"));
            paneauMims.add(nbTotMims);
     
            Object[][] data = {     {champsOracleSIB, champsNumberSIB, champsDateSIB,
                champsStatutSIB, champsQteCommandeSIBRes, champsPrixSIB, champsSupplierSIB, 
                panneauSIB },
                    {champsOracleLSC, champsNumberLSCRes, champsDateLSCRes, champsStatutLSC,
                champsQteLSCRes, champsPrixLSCRes, champsSupplierLSCRes, 
                paneauLSC},
                    {champsOracleAG, champsNumberAGRes, champsDateAGRes, "", 
                champsQteAGRes, champsPrixAGRes, champsSupplierAGRes, 
                paneauAG},
                    {champsOracleMims, champsNumberMimsRes, champsDateMimsRes, "", 
                champsQteMimsRes, champsPrixMimsRes, champsSupplierMimsRes, 
                paneauMims}};
     
            ModeleTableau modele = new ModeleTableau(data, title);
            JTable tableau = new JTable(modele);
            tableau.setRowHeight(30);
            tableau.setGridColor(Color.blue);
            tableau.setDefaultRenderer(JLabel.class, new TableComponent());
            tableau.setDefaultRenderer(JButton.class, new TableComponent());
            tableau.setDefaultRenderer(JPanel.class, new TableComponent());
            //On indique que l'entête doit être au nord, donc au-dessus
            add(tableau.getTableHeader(), BorderLayout.NORTH);
            //Et le corps au centre !
            add(tableau, BorderLayout.CENTER);
     
        }
     
    }
    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
     
    public class ModeleTableau extends AbstractTableModel {
     
        private Object[][] data;
        private String[] title;
        /**
         * Constructeur
         * @param data
         * @param title
         */
        public ModeleTableau(Object[][] data, String[] title){
            this.data = data;
            this.title = title;
        }
     
        /* (non-Javadoc)
         * @see javax.swing.table.TableModel#getColumnCount()
         */
        @Override
        public int getColumnCount() {
            return this.title.length;
        }
     
        /* (non-Javadoc)
         * @see javax.swing.table.TableModel#getRowCount()
         */
        @Override
        public int getRowCount() {
            return this.data.length;
        }
     
        /* (non-Javadoc)
         * @see javax.swing.table.TableModel#getValueAt(int, int)
         */
        @Override
        public Object getValueAt(int row, int col) {
            return this.data[row][col];
        }
     
        /**
         * Retourne le titre de la colonne à l'indice spécifé
         */
        public String getColumnName(int col) {
            return this.title[col];
        }
     
        /**
         * Retourne la classe de la donnée de la colonne
         * @param col
         */
        public Class getColumnClass(int col){
            //On retourne le type de la cellule à la colonne demandée
            //On se moque de la ligne puisque les données sur chaque ligne sont les mêmes
            //On choisit donc la première ligne
            return this.data[0][col].getClass();
        }
    }
    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
    public class TableComponent extends DefaultTableCellRenderer {
     
        public Component getTableCellRendererComponent(JTable table,
                Object value, boolean isSelected, boolean hasFocus, int row,
                int column) {
            // si la valeur de la cellule est un JLabel ou un JButton 
            // on transtype notre valeur
            if (value instanceof JLabel){
                return (JLabel) value;
            } else if (value instanceof JButton){
                return (JButton) value;
            } else if (value instanceof JPanel){
                return (JPanel) value;
            } else {
                return this;
            }
        }
    }
    Quelqu'un aurait-il une idée?

  2. #2
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Une JTable n'affiche pas vraiment des composants en tant que tel.

    Il faut voir le contenu d'une JTable comme une image. Si tu veux gérer des boutons, il va falloir gérer les événements souris directement depuis la table.
    Ensuite tu as une méthode qui te permet de récupérer la cellule qui correspond à certaines coordonées dans l'interface.
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Novembre 2010
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 273
    Par défaut
    Donc si je comprends bien il faut que je redefinisse plutot ActionListener dans ma classe ModeleTableau?
    Et ensuite toujours dans cette classe je mets à jour le contenu de la cellule que je veux?

  4. #4
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    C'est le JTable qu'il faut manipuler, pas le modèle.

    En regardant de plus près, essayes de renvoyer le bouton en tant que renderer.
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  5. #5
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    Citation Envoyé par Nemek Voir le message
    C'est le JTable qu'il faut manipuler, pas le modèle.

    En regardant de plus près, essayes de renvoyer le bouton en tant que renderer.
    Ca ne marchera pas, la JTable intercepte les événements de la souris, il va falloir que tu ajoutes ton propre MouseListener sur la JTable et que tu transmettes les événements à la bonne cellule en cas de click.

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  6. #6
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Citation Envoyé par bulbo Voir le message
    Ca ne marchera pas, la JTable intercepte les événements de la souris, il va falloir que tu ajoutes ton propre MouseListener sur la JTable et que tu transmettes les événements à la bonne cellule en cas de click.

    Bulbo
    Je voulais dire editor
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  7. #7
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Novembre 2010
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 273
    Par défaut
    Bon après avoir passé la matinée à essayer d'utiliser un renderer j'ai opté pour la solution la plus simple, deux colonnes différentes pour mes boutons et basta.

    Par contre je ne peux quand même pas cliquer dessus.

  8. #8
    Membre très actif
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2011
    Messages : 214
    Par défaut
    Citation Envoyé par Benduroy Voir le message
    Par contre je ne peux quand même pas cliquer dessus.
    C'est normal. Les JTable, pour des raisons de performance, utilisent les components retournés par leurs renderers pour dessiner le contenu de leurs cellules mais ne laissent pas ces components en place une fois que la cellule a été déssinée.

    Par contre, en édition, le component et est bien présent dans ta table à l'endroit où tu édites (et ça ne pose pas de problème car on n'édite qu'une seule cellule à la fois).

    Il te faut donc un editor qui retournera un bouton si tu veux vraiment pouvoir cliquer sur ce bouton. Je te conseille de t'inspirer de ce qui est fait pour les JCheckBox (qui sont aussi des AbstractButton comme les JButton) dans le DefaultCellEditor.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème concernant une action Struts JSP
    Par letelwad dans le forum Struts 1
    Réponses: 1
    Dernier message: 17/07/2013, 15h48
  2. [AC-2003] Problème concernant une liste de produit bdd + SQL
    Par Nheil dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 29/03/2010, 08h36
  3. Réponses: 0
    Dernier message: 11/02/2010, 17h49
  4. Problème avec une JTable
    Par Spinoza23 dans le forum AWT/Swing
    Réponses: 34
    Dernier message: 08/02/2007, 20h06
  5. Problèmes avec une JTable
    Par Fab916 dans le forum Composants
    Réponses: 4
    Dernier message: 12/01/2006, 14h11

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