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 :

Pb Action sur un jbutton dans un jtable


Sujet :

Composants Java

  1. #1
    Membre habitué Avatar de snay13
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Points : 166
    Points
    166
    Par défaut Pb Action sur un jbutton dans un jtable
    Bonjour je rencontre un soucis pour rendre actif mes jbutton

    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
     
        private void initTabFichier()
        {  
            String[] titreColonne = { "Date", "Nom du Fichier", "Taille"};
            Object[][] donnees = PathManager.getPathListFileName();
     
            TableAbstractModele TAB_Modele = new TableAbstractModele(donnees, titreColonne);
            TAB_RacinePath = new JTable(TAB_Modele);
            JScrollPane TAB_Scroll = new JScrollPane(TAB_RacinePath);
     
            TableColumn colonne1 = TAB_RacinePath.getColumnModel().getColumn(0); colonne1.setPreferredWidth(100);
            TableColumn colonne2 = TAB_RacinePath.getColumnModel().getColumn(1); colonne2.setPreferredWidth(425);
            TableColumn colonne3 = TAB_RacinePath.getColumnModel().getColumn(2); colonne3.setPreferredWidth(70);
    	for(int i = 0; i < TAB_RacinePath.getRowCount(); i++)  {   TAB_RacinePath.setRowHeight(i, 40);    }
            TAB_RacinePath.getTableHeader().setReorderingAllowed(false);
            TAB_RacinePath.getTableHeader().setResizingAllowed(false);
     
            colonne1.setCellRenderer(new TableLabelRenderer(TAB_RacinePath));
            colonne3.setCellRenderer(new TableLabelRenderer(TAB_RacinePath));
            colonne2.setCellRenderer(new TableButtonRenderer(viewPDF, LAB_NbPagePdf));
    	colonne2.setCellEditor(new TableButtonRenderer(viewPDF, LAB_NbPagePdf));
     
            image.add(TAB_Scroll); TAB_Scroll.setBounds(128, 124, 595, 457);
        }
    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
     
    import javax.swing.table.AbstractTableModel;
     
    public class TableAbstractModele extends AbstractTableModel
    {
        private Object[][] data;
        private String[] title;
     
        public TableAbstractModele(Object[][] data, String[] title)
        {
            this.data = data; this.title = title;
        }
        public int getColumnCount()                             {   return this.title.length;       }
        public int getRowCount()                                {   return this.data.length;        }
        public Object getValueAt(int row, int col)              {   return this.data[row][col];     }
    }
    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
     
    import java.awt.*;
    import java.awt.event.*;
    import java.io.*;
    import java.util.EventObject;
    import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.table.*;
     
    public class TableButtonRenderer extends JButton implements TableCellRenderer, TableCellEditor
    {
        private Object value;
        private PdfManager view;
        private JLabel textePage;
     
        public TableButtonRenderer(PdfManager viewPDF, JLabel texte)
        {
            this.view = viewPDF; this.textePage = texte;
        }
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
        {
            setText((value==null)?"":value.toString());
            return this;
        }
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
        {
            this.value=value;
            final String nomFichier = value.toString();
            setText((value==null)?"":value.toString()); System.out.println(nomFichier);
            addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    //File fichierPdf = new File(Informations.rootPath + "/" + nomFichier);
                    System.out.println(new File(Informations.rootPath + "/" + nomFichier));
                    view.setFichierPdf(new File(Informations.rootPath + "/" + nomFichier)); view.setPagePdf(1);
                    textePage.setText(view.getCurrentPagePdf() + " sur " + view.getNbPagePdf());
                }
            });
            return this;
        }
     
        public void cancelCellEditing()                             {}
        public boolean stopCellEditing()                            {   return false;   }
        public Object getCellEditorValue()                          {   return value;   }
        public boolean isCellEditable(EventObject anEvent)          {   return true;    }
        public boolean shouldSelectCell(EventObject anEvent)        {   return true;   }
        public void addCellEditorListener(CellEditorListener l)     {}
        public void removeCellEditorListener(CellEditorListener l)  {}
     
    }
    Quelqu'un voit d'où vient le problème?
    Pourtant isCellEditable est bien à true!!!

    Merci

  2. #2
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Mieux vaut écrire un TableCellRenderer et un TableCellEditor séparés que les deux en une classe. C'est plutôt foutoir et bug prone (interaction entre les différents états du renderer et ceux de l'editor, sans même parler de leur contenu.

  3. #3
    Membre habitué Avatar de snay13
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Points : 166
    Points
    166
    Par défaut
    J'ai les séparé en deux classes mais je n'ai toujours pas de réaction sur les jbutton

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    import java.awt.*;
    import javax.swing.*;
    import javax.swing.table.*;
     
    public class TableButtonRenderer extends JButton implements TableCellRenderer
    {
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
        {
            setText((value==null)?"":value.toString());
            return this;
        }
    }
    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
     
    import java.awt.*;
    import java.awt.event.*;
    import java.io.File;
    import java.util.EventObject;
    import javax.swing.*;
    import javax.swing.event.CellEditorListener;
    import javax.swing.table.TableCellEditor;
     
    public class TableButtonEditor extends JButton implements TableCellEditor
    {
        private Object value;
        private PdfManager view;
        private JLabel textePage;
     
        public TableButtonEditor(PdfManager viewPDF, JLabel texte)
        {
            this.view = viewPDF; this.textePage = texte;
        }
          public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
        {
            this.value=value;
            final String nomFichier = value.toString();
            setText((value==null)?"":value.toString()); System.out.println(nomFichier);
            addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    System.out.println(new File(Informations.rootPath + "/" + nomFichier));
                    view.setFichierPdf(new File(Informations.rootPath + "/" + nomFichier)); view.setPagePdf(1);
                    textePage.setText(view.getCurrentPagePdf() + " sur " + view.getNbPagePdf());
                }
            });
            return this;
        }
     
        public void cancelCellEditing()                             {}
        public boolean stopCellEditing()                            {   return false;   }
        public Object getCellEditorValue()                          {   return value;   }
        public boolean isCellEditable(EventObject anEvent)          {   return true;    }
        public boolean shouldSelectCell(EventObject anEvent)        {   return true;   }
        public void addCellEditorListener(CellEditorListener l)     {}
        public void removeCellEditorListener(CellEditorListener l)  {}
    }

  4. #4
    Membre habitué Avatar de snay13
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Points : 166
    Points
    166
    Par défaut
    J'ai fait un autre test sans passe par ma classe tableAbstractModele et ca fonctionne

    Mon probleme vient donc surement de ma classe tableAbstractModele mais alors je ne voit pas ou

    Autre chose dans mon action dans getTableCellEditorComponent (actionPerformed), il garde en memoire les autres actions effectués avant et me les repetent

    Qu'elqu'un a t'il une idées sur ces problèmes?
    Merci

  5. #5
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    C'est simple, tu ajoutes un listener à ton bouton à chaque fois que la méthode getTableCellEditorComponent est appelée. Or il n'y a qu'un seul Editor pour ta Colonne (motif FlyWeight de conception de la JTable) donc à chaque clic tu ajoutes un nouveau listener à ton unique bouton.

    Donc il te faut tout simplement stocker la valeur à afficher (nomFichier) dans un attribut et non une variable locale et il suffit d'ajouter ton listener dans le constructeur de ton editor.

  6. #6
    Membre habitué Avatar de snay13
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Points : 166
    Points
    166
    Par défaut
    Merci pour ta réponse
    Effectivement en mettant le listener dans mon constructeur je ne génère plus qu'un seul évènement

    Par contre, pour le premier problème, j'arrive toujours par à générer une action quand j'utilise mon modele de table
    si je le shunte ca fonctionne!!

    Tu as une idee d'ou ça peut venir. Peut etre un conflit entre mon modele de table et la methode isCellEditable de l'editor

  7. #7
    Membre habitué Avatar de snay13
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Points : 166
    Points
    166
    Par défaut
    C'est bon, j'ai trouvé
    j'ai rajouté dans mon modele de jtable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        public boolean isCellEditable(int row, int col)
        {
            return true;
        }

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

Discussions similaires

  1. Action sur une touche dans un sous-formulaire
    Par nomade333 dans le forum IHM
    Réponses: 2
    Dernier message: 24/12/2007, 15h36
  2. Utilsation des JButton dans une Jtable
    Par henpower dans le forum Composants
    Réponses: 4
    Dernier message: 18/09/2007, 17h58
  3. PB du caret sur un JTextField dans une Jtable
    Par jeffciara dans le forum Composants
    Réponses: 4
    Dernier message: 14/11/2006, 19h48
  4. Comment mettre un JButton dans une JTable
    Par vinceLeBarbare dans le forum Composants
    Réponses: 6
    Dernier message: 05/06/2006, 12h43
  5. Icon pour pour JButton dans une Jtable + pb colonnes
    Par dim_italia dans le forum Composants
    Réponses: 3
    Dernier message: 22/02/2006, 19h05

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