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

  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
    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.

  7. #7
    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.

  8. #8
    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

  9. #9
    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
    Je voulais dire editor
    T'aurais pas du c'est guère mieux un renderer qui affiche le bouton et un mouselistener qui transfère les événements vers le bouton qu'il faut.

    Au pire si ça coince je verrai si j'ai le temps de faire un exemple de ça .. mais n'espérez pas trop c'est tendu en ce moment.

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

  10. #10
    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 voilà ce que j'ai essayé (pris ici ):

    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
        public class MyTableCellEditor extends AbstractCellEditor implements TableCellEditor {
            // This is the component that will handle the editing of the cell value
            JComponent component = new JButton();
     
            // This method is called when a cell value is edited by the user.
            public Component getTableCellEditorComponent(JTable table, Object value,
                    boolean isSelected, int rowIndex, int vColIndex) {
                // 'value' is value contained in the cell located at (rowIndex, vColIndex)
     
                if (isSelected) {
                    // cell (and perhaps other cells) are selected
                }
     
                // Configure the component with the specified value
                ((JButton)component).setText((String)value);
     
                // Return the configured component
                return component;
            }
     
            // This method is called when editing is completed.
            // It must return the new value to be stored in the cell.
            public Object getCellEditorValue() {
                return ((JButton)component).getText();
            }
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            TableColumn col = tableau.getColumnModel().getColumn(7);
            col.setCellEditor(new MyTableCellEditor());
    Mais j'obtiens l'erreur suivante lorsque je clique simplement sur un bouton: Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.JButton cannot be cast to java.lang.String

  11. #11
    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 bulbo Voir le message
    T'aurais pas du c'est guère mieux un renderer qui affiche le bouton et un mouselistener qui transfère les événements vers le bouton qu'il faut.
    Tu vas t'amuser pour reproduire le comportement d'un bouton.

    Citation Envoyé par Benduroy Voir le message
    Mais j'obtiens l'erreur suivante lorsque je clique simplement sur un bouton: Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.JButton cannot be cast to java.lang.String
    Oui, car tu as des JButton dans ton modèle (paramètre "value") et tu le cast en String. Retourne directement le bouton de ton modèle dans tes différentes méthodes.

    Au passage, mettre des Component dans un modèle ça fait un peu bizarre. Généralement dans un modèle tu as des primitifs ou des objets métiers et c'est le renderer qui les "transforme" en component.

  12. #12
    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
    T'aurais pas du c'est guère mieux un renderer qui affiche le bouton et un mouselistener qui transfère les événements vers le bouton qu'il faut.

    Au pire si ça coince je verrai si j'ai le temps de faire un exemple de ça .. mais n'espérez pas trop c'est tendu en ce moment.

    Bulbo
    Pourtant ça marche avec une Checkbox et une Combobox
    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

  13. #13
    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
    Pourtant ça marche avec une Checkbox et une Combobox
    Checkbox est utilisé par défaut pour les types Booléens du coup je pense que la JTable transmet elle même les événements qui vont bien.

    Pour une combo je pense que tu retombes sur le même problème qu'avec les boutons.

    Pour le problème présent, les boutons ne doivent pas être dans le modèle, ils doivent être ajouté par le biais d'un renderer.

    L'inconvénient de l'utilisation de l'editor c'est qu'il faut déjà cliqué ou double-cliquer sur la cellule pour la passer en édition .. donc avant qu'un click ne soit transmit au bouton, tu as déjà cliqué un certain nombre de fois, ce qui peut être déroutant à mon avis.

    pour -gma, tu ne reproduis pas le comportement d'un bouton, tu transmets juste l'event au JButton.

    genre avec une bidouille comme celle ci:

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tonEvent = (MouseEvent) SwingUtilities.convertMouseEvent(taTable, event, tonBouton);
    tonBouton.dispatchEvent(tonEvent);
    taTable.repaint();

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

  14. #14
    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
    Ca marche très bien avec une combox et de mémoire c'est même un des exemples.

    Sûrement que cette méthode peut doit aider ;-)
    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

  15. #15
    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
    Oui, car tu as des JButton dans ton modèle (paramètre "value") et tu le cast en String. Retourne directement le bouton de ton modèle dans tes différentes méthodes.
    Même problème là:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    component = (JComponent)value;
    Et puis essayez de vous mettre d'accords car moi je ne sais plus quoi faire.

  16. #16
    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 bulbo Voir le message
    L'inconvénient de l'utilisation de l'editor c'est qu'il faut déjà cliqué ou double-cliquer sur la cellule pour la passer en édition ..
    Pas forcément, ça dépend de la méthode "isCellEditable(EventObject)" de l'editor. Encore une fois, regarde DefaultCellEditor


    Citation Envoyé par bulbo Voir le message
    pour -gma, tu ne reproduis pas le comportement d'un bouton, tu transmets juste l'event au JButton.

    genre avec une bidouille comme celle ci:

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tonEvent = (MouseEvent) SwingUtilities.convertMouseEvent(taTable, event, tonBouton);
    tonBouton.dispatchEvent(tonEvent);
    taTable.repaint();
    Si tu as autant d'instance de JButton que de boutons dessinés dans ta table pourquoi pas, mais bon...

  17. #17
    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 -gma- Voir le message
    Pas forcément, ça dépend de la méthode "isCellEditable(EventObject)" de l'editor. Encore une fois, regarde DefaultCellEditor
    Ca c'est pour que ce soit éditable et n'a aucune influence sur le nombre de click.
    Ce qu'a proposé Nemek n'est pas mieux .. tu dois cliqué minimum 2x pour un click de bouton, au moins le premier click sur le bouton .. une fois pour passer en mode édition et avoir le bouton de l'éditor et une fois pour cliquer le bouton lui même.

    Sur une combo c'est moyennement gênant vu que ça peut correspondre au comportement que l'on veut, pour un bouton .. je persiste à dire que ça peut être déroutant.


    Citation Envoyé par -gma- Voir le message
    Si tu as autant d'instance de JButton que de boutons dessinés dans ta table pourquoi pas, mais bon...
    On pourrait avoir un JButton dans un CellRenderer et un ActionPerformed qui tiendrait compte de la cell qu'on a cliqué. J'ai donné des pistes à suivre et des méthodes utiles pas une implémentation complète. Après moi je m'en fous, je sais faire, c'est pas comme si je n'avais pas 15 ans de java derrière moi.

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

  18. #18
    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 bulbo Voir le message
    Ca c'est pour que ce soit éditable et n'a aucune influence sur le nombre de click.
    Ce qu'a proposé Nemek n'est pas mieux ..
    Il faudra que tu m'expliques ce que tu entends par "aucune influence":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public boolean isCellEditable(EventObject anEvent) {
    	    if (anEvent instanceof MouseEvent) { 
    		return ((MouseEvent)anEvent).getClickCount() >= clickCountToStart;
    	    }
    	    return true;
    }
    source

    Citation Envoyé par bulbo Voir le message
    tu dois cliqué minimum 2x pour un click de bouton, au moins le premier click sur le bouton .. une fois pour passer en mode édition et avoir le bouton de l'éditor et une fois pour cliquer le bouton lui même.
    J'aimerai savoir quel LaF tu utilises parce que chez moi ça marche très bien en un seul clic (le BasicTableUI se charge de reposter le "mouse pressed" si l'édition a commencé)

    Après je pense que Benduroy n'a pas forcément envie de réinventer la roue, mais dans un sens je m'en foue aussi

  19. #19
    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 -gma- Voir le message
    Il faudra que tu m'expliques ce que tu entends par "aucune influence":
    Pour qu'une cellule soit en édition il faut que tu aies cliqué au moins une fois dedans non ?
    Visuellement donc tu as cliqué sur un bouton qui ne s'est pas enfoncé et n'a rien lancé comme action .. mais si tu recliques dessus, maintenant qu'il est en édition, bien sur ça va marcher .. c'est exactement ce que j'ai dit plus haut .. 2 clicks mini pour un click sur le bouton seulement.


    Et ce n'est pas reinventer la roue que de simplement récupérer la ligne et la colonne du click, et de transmettre un événement au bouton, enfin pas beaucoup plus que ta bidouille à base d'éditeur je pense.

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

  20. #20
    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
    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
    import java.awt.Component;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.EventObject;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.WindowConstants;
    import javax.swing.event.CellEditorListener;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.EventListenerList;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableCellEditor;
    import javax.swing.table.TableCellRenderer;
     
    public class TableButtonCell {
     
       public static void main(final String[] args) {
     
     
          final EventListenerList listeners = new EventListenerList();
          final JButton button = new JButton();
          button.addActionListener(new ActionListener() {
             public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(null, "Salut " + button.getText());
                ChangeEvent event = null;
                for (CellEditorListener l : listeners.getListeners(CellEditorListener.class)) {
                   if (event == null) {
                      event = new ChangeEvent(this);
                   }
                   l.editingCanceled(event);
                }
             }
          });
          DefaultTableModel model = new DefaultTableModel(new Object[][] { { "Tartuffe" } }, new Object[] { "Title" } );
          JTable table = new JTable(model);
          table.getColumnModel().getColumn(0).setCellRenderer(new TableCellRenderer() {
     
             public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
                   int row, int column) {
                button.setText(String.valueOf(value));
                return button;
             }
          });
          table.getColumnModel().getColumn(0).setCellEditor(new TableCellEditor() {
     
             public boolean stopCellEditing() {
                return true;
             }
     
             public boolean shouldSelectCell(EventObject anEvent) {
                return true;
             }
     
             public void addCellEditorListener(CellEditorListener l) {
                listeners.add(CellEditorListener.class, l);
             }
     
             public boolean isCellEditable(EventObject anEvent) {
                return true;
             }
     
             public void removeCellEditorListener(CellEditorListener l) {
                listeners.remove(CellEditorListener.class, l);
             }
     
             public Object getCellEditorValue() {
                return button.getText();
             }
     
             public void cancelCellEditing() {
             }
     
             public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
                button.setText(String.valueOf(value));
                return button;
             }
          });
     
          JFrame frame = new JFrame("My Table");
          frame.setSize(640, 480);
          frame.getContentPane().add(new JScrollPane(table));
          frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
          frame.setLocationRelativeTo(null);
          frame.setVisible(true);
       }
    }
    15 ans de Java n'a pas suffit visiblement ...
    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

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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