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 :

Nouveau Problème avec les JTable


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé 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
    Par défaut Nouveau Problème avec les JTable
    J'en peux plus de ces jtables

    J'ai crée une jtable avec un model

    le principe est de récuperer la liste des fichiers dans un répertoire et en sélectionnant le nom du fichier (un jbutton) afficher une miniature dans un jpanel.
    Jusqu'ici pas de problème

    La ou ça se corse, c'est que j'ai un jbutton indépendant de la jtable qui modifie le nom du fichier. La modification du nom du fichier s'effectue correctement mais suite à ça je n'arrive pas à mettre à jour le nom du fichier dans ma jtable.

    Pour mettre à jour je relance mon initTabFichier, à ce moment là le nom apparait modifié mais dés que je passe la souris au dessus dunom dans la table l'ancien nom revient


    Créationde la jtable :
    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
     
    private void initTabFichier()
        {  
            TAB_Model = new TableAbstractModele();
            TAB_RacinePath = new JTable(TAB_Model);
            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());
            colonne1.setCellEditor(new TableLabelEditor());
            colonne3.setCellRenderer(new TableLabelRenderer());
            colonne3.setCellEditor(new TableLabelEditor());
            colonne2.setCellRenderer(new TableButtonRenderer());
    	colonne2.setCellEditor(new TableButtonEditor(viewPDF, LAB_NbPagePdf));
     
            image.add(TAB_Scroll); TAB_Scroll.setBounds(128, 124, 595, 457);
        }
    Création du modele de table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    import javax.swing.table.AbstractTableModel;
     
    public class TableAbstractModele extends AbstractTableModel 
    {
        private String[] title =  { "Date", "Nom du Fichier", "Taille"};
        private Object[][] data = PathManager.getPathListFileName(); ;
     
        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];             }
        public String getColumnName(int col)                    {   return this.title[col];                 }//affichage des noms de colonne
        public boolean isCellEditable(int row, int col)         {   return true;                            }
    }
    Editor de la jtable :
    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 static String nomFichier;
        private PdfManager view; private JLabel textePage;
     
        public TableButtonEditor(PdfManager viewPDF, JLabel texte)
        {
            this.view = viewPDF; this.textePage = texte;
            addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    view.setFichierPdf(new File(Informations.rootPath + "/" + nomFichier)); view.setPagePdf(1);
                    textePage.setText(view.getCurrentPagePdf() + " sur " + view.getNbPagePdf());
                }
            });
        }
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
        {
            this.value=value;
            nomFichier = value.toString();
            setFocusable(false);setBackground(new Color(0x73fbe6));
            setText((value==null)?"":value.toString()); 
            return this;
        }
        public void cancelCellEditing()                             {}
        public boolean stopCellEditing()                            {   return true;            }
        public Object getCellEditorValue()                          {   return value;           }
        public boolean isCellEditable(EventObject anEvent)          {   return true;            }
        public boolean shouldSelectCell(EventObject anEvent)        {   return false;           }
        public void addCellEditorListener(CellEditorListener l)     {}
        public void removeCellEditorListener(CellEditorListener l)  {}
        public static String getValue()                             {   return nomFichier ;     }
    }
    Bouton renommant le fichier (et mets à jour la jtable)
    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
     
    if(source == BOU_Rename)
            {
                FenetreDialogue FEN_Rename = new FenetreDialogue(this, "Renommer le Fichier", true);
                String newNomFichier = FEN_Rename.setDialog(); FEN_Rename.dispose();
     
                if(newNomFichier != null)
                {
                    File oldFichier = new File(Informations.rootPath + "/" + TableButtonEditor.getValue());
                    File newFichier = new File(Informations.rootPath + "/" + newNomFichier + ".pdf");
                    viewPDF.setClosePdf();
                    boolean qsd = oldFichier.renameTo(newFichier);
                    System.out.println(qsd);
                    try     {   Thread.sleep(500);  }   catch (InterruptedException ex)     {}
     
                    initTabFichier();
                }
    Merci

  2. #2
    Membre éclairé 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
    Par défaut
    Personne n'a d'idée??

  3. #3
    Membre très actif
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Par défaut
    Faut voir le CellRenderer.

    Sinon c'est ton nom qui n'est pas physiquement mis à jour ?

  4. #4
    Membre éclairé 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
    Par défaut
    Merci de me répondre

    J'ai fait quelque modification depuis

    lorsque j'appui sur le bouton independant de la jtable pour modifier le nom de fichier j'appelle une fonction setValueAt demon modele de table avec fireTableCellUpdated
    Suite à ca le nom est bien mis à jour sur le disque dur
    et pour qu'il soit à jour dans la jtable il faut que je sélectionne une autre ligne

    Je remets les codes modifiés

    Table
    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
     
    TAB_Model = new TableAbstractModele(PathManager.getPathListFileName());
            TAB_RacinePath = new JTable(TAB_Model);
            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);
            TAB_RacinePath.setRowHeight(40);
            TAB_RacinePath.getTableHeader().setReorderingAllowed(false);
            TAB_RacinePath.getTableHeader().setResizingAllowed(false);      
            TAB_RacinePath.setRowSelectionInterval(0, 0);
     
            colonne1.setCellRenderer(new TableLabelRenderer());
            colonne3.setCellRenderer(new TableLabelRenderer());
            colonne2.setCellRenderer(new TableButtonRenderer()); 
    	colonne2.setCellEditor(new TableButtonEditor());
    	TAB_RacinePath.getSelectionModel().addListSelectionListener(this);
            //TAB_RacinePath.getModel().addTableModelListener(this);
     
            image.add(TAB_Scroll); TAB_Scroll.setBounds(128, 124, 595, 457);
    Modele de table :
    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
     
    public class TableAbstractModele extends AbstractTableModel 
    {
        private String[] title =  { "Date", "Nom du Fichier", "Taille"};
        private Object[][] data;
     
        public TableAbstractModele(Object[][] data)             {   this.data = data;                       }
     
        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];             }
        //affichage des noms de colonne
        @Override
        public String getColumnName(int col)                    {   return this.title[col];                 }
        @Override
        public boolean isCellEditable(int row, int col)         {   return col==1;                          }
        @Override
        public void setValueAt(Object value, int row, int col)
        {
            this.data[row][col] = value;
            fireTableCellUpdated(row, col);
        }
     
    }
    boutonRenderer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class TableButtonRenderer extends JButton implements TableCellRenderer
    {
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
        {
            setBackground(new Color(0x86dbce));
            setText(value.toString());
            return this;
        }
    }
    boutonEditor
    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
     
    public class TableButtonEditor extends JButton implements TableCellEditor
    {
        private Object value;
     
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
        {
            this.value = value; setFocusable(false);
            setBackground(new Color(0x73fbe6)); setText(value.toString());
            return this;
        }
        public void cancelCellEditing()                             {}
        public boolean stopCellEditing()                            {   return true;            }
        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)  {}
    }
    Modification du nom de fichier:
    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
     
    //Renommer le fichier PDF
            if(source == BOU_Rename && TAB_RacinePath.isEditing())
            {
                FenetreRenommerPDF FEN_Rename = new FenetreRenommerPDF(this, "Renommer le Fichier", true);
                String newNomFichier = FEN_Rename.setDialog(); FEN_Rename.dispose();
                if(newNomFichier != null)
                {
                    int row = TAB_RacinePath.getSelectedRow();
                    int col = TAB_RacinePath.getSelectedColumn();
                    Object value = new String(newNomFichier + ".pdf");
     
                    File oldFichier = new File(Informations.rootPath + "/" + TAB_Model.getValueAt(row, col));
                    File newFichier = new File(Informations.rootPath + "/" + newNomFichier + ".pdf");
                    viewPDF.setClosePdf();
                    boolean result = oldFichier.renameTo(newFichier); System.out.println(result);                
                    try     {   Thread.sleep(500);  }   catch (InterruptedException ex)     {}
     
                    TAB_Model.setValueAt(value, row, col);
                }
            }
    Merci de m'aider
    je suis en train de craquer

  5. #5
    Membre très actif
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Par défaut
    Pour ma part lorsque je modifie une valeur dans un jtable :

    Je fait cela dans le tableModel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public void setValueAt(Object value, int row, int col)
        {
            this.data[row][col] = value;
            //fireTableCellUpdated(row, col);
    	fireTableDataChanged();
        }

  6. #6
    Membre éclairé 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
    Par défaut
    J'ai essayé cette methode fireTableDataChanged(); mais il me renvoie une erreur

    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
     
    Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
            at apptekprod2.TableAbstractModele.getValueAt(TableAbstractModele.java:15)
            at apptekprod2.FenetreMain.valueChanged(FenetreMain.java:179)
            at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:167)
            at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:137)
            at javax.swing.DefaultListSelectionModel.setValueIsAdjusting(DefaultListSelectionModel.java:668)
            at javax.swing.JTable.clearSelectionAndLeadAnchor(JTable.java:2095)
            at javax.swing.JTable.tableChanged(JTable.java:4433)
            at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
            at javax.swing.table.AbstractTableModel.fireTableDataChanged(AbstractTableModel.java:182)
            at apptekprod2.TableAbstractModele.setValueAt(TableAbstractModele.java:25)
            at apptekprod2.FenetreMain.actionPerformed(FenetreMain.java:149)
            at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
            at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
            at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
            at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
            at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
            at java.awt.Component.processMouseEvent(Component.java:6263)
            at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
            at java.awt.Component.processEvent(Component.java:6028)
            at java.awt.Container.processEvent(Container.java:2041)
            at java.awt.Component.dispatchEventImpl(Component.java:4630)
            at java.awt.Container.dispatchEventImpl(Container.java:2099)
            at java.awt.Component.dispatchEvent(Component.java:4460)
            at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
            at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
            at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
            at java.awt.Container.dispatchEventImpl(Container.java:2085)
            at java.awt.Window.dispatchEventImpl(Window.java:2478)
            at java.awt.Component.dispatchEvent(Component.java:4460)
            at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
            at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
            at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
            at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
            at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
            at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
            at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
    Le nom de fichier est bien modifié sur le disque et quand je clique sur une autre ligne, il me modifie bien le nom

    j'ai mis un System.out.println(row + " " + col); dans la methode getValueAt
    et suite au fireTableDataChanged il m'affiche -1 -1 puis affiche cet erreur

  7. #7
    Membre éclairé 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
    Par défaut
    oui apparemment

    mais je n'ai pas la mise à jour automatique de ma table. Je suis obligé de cliquer sur une autre ligne pour voir ma table mise à jour


  8. #8
    Membre éclairé 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
    Par défaut
    ca y est j'ai trouve


    j'ai rajouté un implements TableModelListener sur ma classe principale de ma table et dans la méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        public void tableChanged(TableModelEvent e)
        {
            TAB_RacinePath.editingCanceled(new ChangeEvent(e));
        }
    et la comme par magie l'affichage s'est mis a jour automatiquement sans forcement cliquer sur une autre ligne

    Merci à William44290 pour sa contribution

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

Discussions similaires

  1. Problème avec les JTable
    Par salmgh dans le forum Composants
    Réponses: 0
    Dernier message: 14/05/2011, 02h47
  2. JTable : problème avec les checkbox dans les colonnes
    Par oelydina dans le forum Composants
    Réponses: 2
    Dernier message: 04/11/2008, 22h40
  3. [JTable] Problèmes avec les lignes
    Par bonui13 dans le forum Composants
    Réponses: 8
    Dernier message: 28/03/2007, 13h59
  4. Problème avec les fichiers .JPG
    Par cprogil dans le forum Langage
    Réponses: 5
    Dernier message: 10/06/2003, 15h44
  5. []Problème avec les formulaires Outlook
    Par Invité dans le forum Outlook
    Réponses: 6
    Dernier message: 05/12/2002, 09h59

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