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

  1. #1
    Futur Membre du Club
    [Swing / JTable] Rendre les cellules d'un JTable non éditables
    Salut, ca fait une heure que je galère a passer toutes les méthodes de JTable, j'aimerai simplement rendre mes cellules non-editable, tout en pouvant toujours selectionner mes lignes ( car quand je met setEnabled(false) je pe certe pu editer mes cellules mais je ne pe plus rien selectionner non plus !!!)
    Si quelqu'un a une idée ...
    Merci d'avance
    [color=blue][ Modéré par [/color]vedaer ]
    -> Ajout du tag dans le titre
    [color=blue][ Merci de respecter les [/color]Règles du Forum ]

  2. #2
    Membre du Club
    Il faut faire une recherche sur le forum avant de poster un message!

    Va voir celui là :

    http://www.developpez.net/forums/vie...ic.php?t=74000

    Cela devrait t'aider...
    eraim

    "Nous gagnerions plus de nous laisser voir tels que nous sommes, que d'essayer de paraître ce que nous ne sommes pas"
    [François de La Rochefoucauld]

  3. #3
    Membre chevronné
    Bienvenue dans le monde des JSwing... Des composants très puissants mais ou il faut en chier pour bien comprendre comment ça fonctionne.

    Ca fait 2 jours que je suis également sur les JTable et j'ai le même problème que toi.
    Alors je crois que le mieux est de télécharger les exemples sur le site de sun et de les comprendre.

    Bon courage... Si quelqu'un pouvait nous aider ce serait quand même mieux

    A++
    .o0o__St@iLeR__oOo.

    Lead Developer

    ASP.NET MVC - MCP/MCSD ASP.NET
    PHP Zend Framework / PhalconPHP
    Cordova/Xamarin IOS/Android
    Kendo UI - ExtJS - JQwidgets
    SQL Server / MySQL

  4. #4
    Futur Membre du Club
    Ca y ait, c'est résolu !!!
    Merci, eraim et désolé mais hier j'ai pas eu le tps de chercher sur le forum

    Pour ceux que ca interresse (Stailer en particulier, je pense) :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        DefaultTableModel dtmTableModel = new DefaultTableModel (donnees,Titre){
        public boolean isCellEditable(int iRowIndex, int iColumnIndex)
        {
              return false;
        }
      };
      m_jTable = new JTable(dtmTableModel);

  5. #5
    Membre chevronné
    Ouaip ouaip... C'est le code que j'avais trouvé mais je n'ai pas fait la même chose sur :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
     m_jTable = new JTable(dtmTableModel);


    Donc j'essaye ca à midi ou ce soir.

    Merci beaucoup pour ce code.

    A++
    .o0o__St@iLeR__oOo.

    Lead Developer

    ASP.NET MVC - MCP/MCSD ASP.NET
    PHP Zend Framework / PhalconPHP
    Cordova/Xamarin IOS/Android
    Kendo UI - ExtJS - JQwidgets
    SQL Server / MySQL

  6. #6
    Membre chevronné
    Et ben ca fonctionne pas... Je comprends plus..

    Voila mon code de départ :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    String[] colonnes = {"ID","[Titre 1]","Titre 2"};
      DefaultTableModel modele = new DefaultTableModel(colonnes, 0);// application des colonnes dans le modele
      public boolean isCellEditable(int iRowIndex, int iColumnIndex)
     {
           return false;
     }
     
      JTable jTable1 = new JTable(modele);


    Et voila le code qui ajoute des lignes (il est dans une boucle) :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     
     TableModele.setNumRows(maliste.size());
     TableModele.setValueAt(mResult, y , x-1);


    J'ai essayé de mettre modele.iscelleditable partout ou je pouvais.. Rien n'y fait. C'est le mystère.

    Avant de tout casser et faire une classe dérivée AbstractTableModel t'aurais pas une idée par hasard ?
    .o0o__St@iLeR__oOo.

    Lead Developer

    ASP.NET MVC - MCP/MCSD ASP.NET
    PHP Zend Framework / PhalconPHP
    Cordova/Xamarin IOS/Android
    Kendo UI - ExtJS - JQwidgets
    SQL Server / MySQL

  7. #7
    Futur Membre du Club
    Citation Envoyé par stailer
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    String[] colonnes = {"ID","[Titre 1]","Titre 2"};
      DefaultTableModel modele = new DefaultTableModel(colonnes, 0);// application des colonnes dans le modele
      public boolean isCellEditable(int iRowIndex, int iColumnIndex)
     {
           return false;
     }
     
      JTable jTable1 = new JTable(modele);

    essaye de mettre plutot :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Object[] colonnes = {"ID","[Titre 1]","Titre 2"};
    Object[][] Donnees = {}; 
      DefaultTableModel modele = new DefaultTableModel(Donnees,colonnes0);
      public boolean isCellEditable(int iRowIndex, int iColumnIndex)
     {
           return false;
     }
     
      JTable jTable1 = new JTable(modele);

  8. #8
    Membre chevronné
    Salut,

    merci de m'aider... Ca marche pas non plus.
    En fait TOUT marche sauf isCellEditable... Comme s'il ne reconnaissait pas la nouvelle méthode.

    Alors j'ai essayé ça :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      public boolean isCellEditable(int iRowIndex, int iColumnIndex) 
    { 
        System.out.println("test");  
        return false; 
    }


    Et il n'y passe pas !

    Donc y a un truc... Je sais pas quoi... Je vais essayer de créer une nouvelle classe.

    Si tu as (encore) une autre idée, n'hésite pas.
    Merci pour ton aide
    .o0o__St@iLeR__oOo.

    Lead Developer

    ASP.NET MVC - MCP/MCSD ASP.NET
    PHP Zend Framework / PhalconPHP
    Cordova/Xamarin IOS/Android
    Kendo UI - ExtJS - JQwidgets
    SQL Server / MySQL

  9. #9
    Membre chevronné
    Et ben vi ! C'était ça !

    Putin... Si jusqu'à maintenant j'étais un peu "affolé" par la programmation objet, avec Java j'ai de quoi me mettre sous la dent. LoL... Au moins je saurais de quoi je parle huhuhuhu.

    Merci encore de ton aide.

    A++
    .o0o__St@iLeR__oOo.

    Lead Developer

    ASP.NET MVC - MCP/MCSD ASP.NET
    PHP Zend Framework / PhalconPHP
    Cordova/Xamarin IOS/Android
    Kendo UI - ExtJS - JQwidgets
    SQL Server / MySQL

  10. #10
    Futur Membre du Club
    Tu developpe avec kel logiciel ??

  11. #11
    Membre chevronné
    Avec JBuilder.

    En fait j'ai crée une nouveau fichier avec une nouvelle classe dérivée :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class ModeleTab extends DefaultTableModel
     
     ...
     
     
    public boolean isCellEditable(int iRowIndex, int iColumnIndex) 
        { 
              return false; 
        } 
     
    }


    Mais je trouve ça bien puisqu'au moins mon code du modèle n'est pas mélangé avec le reste... Surtout si dois encore le "personnalisé" et donc redéfinir d'autres méthodes.
    .o0o__St@iLeR__oOo.

    Lead Developer

    ASP.NET MVC - MCP/MCSD ASP.NET
    PHP Zend Framework / PhalconPHP
    Cordova/Xamarin IOS/Android
    Kendo UI - ExtJS - JQwidgets
    SQL Server / MySQL

  12. #12
    Futur Membre du Club
    A tout hasard, tu saurai pa comme fait une "Actualisation" de mon panel ...

  13. #13
    Membre du Club
    Ca ne marche pas en faisant :
    eraim

    "Nous gagnerions plus de nous laisser voir tels que nous sommes, que d'essayer de paraître ce que nous ne sommes pas"
    [François de La Rochefoucauld]

  14. #14
    Futur Membre du Club
    nan ca marche pas !!

  15. #15
    Membre habitué
    avec un peu en retard :)
    voilà ce que j'ai fait... avec 5 ans de retard mais je viens juste d'avoir le problème et je suis tombé sur cette discussion.
    Au cas où quelqu'un passe par là dans 10 ans ça peut toujours servir.

    donc, je créé une classe NonEditableDefaultTableModel utilisable à la place de DefaultTableModel

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import javax.swing.table.DefaultTableModel;
     
    public class NonEditableDefaultTableModel extends DefaultTableModel {
     
    	public boolean isCellEditable(int iRowIndex, int iColumnIndex) { 
     
    		return false; 
        } 
    }


    bon c'est vrai, ça bloque l'édition de tout le tableau, mais c'est ce que l'on veut là.

    ensuite au lieu de faire :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    DefaultTableModel tableModel = new DefaultTableModel();

    je fait :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    DefaultTableModel tableModel = new NonEditableDefaultTableModel();


    et pour en revenir à l'actualisation d'un JTable.

    je créer un nouveau DefaultTableModel et je fait un setModel avec.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DefaultTableModel nouveauTableModel = new DefaultTableModel();
    //...
    //bricolage de mon nouveauTableModel
    //..
    monJTableARafraichir.setModel(nouveauTableModel);


    Et hop mon tableau change.
    Le plus compliqué, c'est de faire quelque chose de simple.

  16. #16
    Membre habitué
    Yep merci bien
    J'ai été confronté à ce problème de "rafraichissement" y'a pas longtemps... Je vais tester ta solution

  17. #17
    Membre du Club
    Salut,
    presque un an de retard, mais là je suis confronté au problème de rendre un JTable non éditable.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    package test;
     
    import javax.swing.table.DefaultTableModel;
     
    public class NonEditableDefaultTableModel extends DefaultTableModel {
     
    	public boolean isCellEditable(int iRowIndex, int iColumnIndex) { 
     
    		return false; 
        } 
    }



    Comment je dois déclarer ma JTable en non éditable ?


    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
    package Moteur;
     
     
    import javax.swing.*;
    import org.jdom.Document;
    import org.jdom.Element;
    import org.jdom.input.SAXBuilder;
    import java.awt.Dimension;
    import java.awt.GridLayout;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.io.File;
    import java.util.Iterator;
    import java.util.List;
     
    import java.util.Vector;
    import javax.swing.table.DefaultTableModel;
     
    public class XmlToJTabble extends JPanel {
     
        private final boolean DEBUG = false;
        private Document document;
        private final Element racine;
        private final JScrollPane scrollPane;
        private final JTable table;
        private final Vector columnNames;
        private final Vector data;
     
        public XmlToJTabble() {
            super(new GridLayout(1, 0));
            columnNames = new Vector();
            columnNames.add("nom");
            columnNames.add("IdClient");
            columnNames.add("Type");
            columnNames.add("Taille");
            columnNames.add("DateEnvoi");
            columnNames.add("AncienNom");
     
            data = new Vector();
            table = new JTable(data, columnNames);        
            table.setPreferredScrollableViewportSize(new Dimension(900, 70));
            table.setFillsViewportHeight(true);
            if (DEBUG) {
                table.addMouseListener(new MouseAdapter() {
     
                    @Override
                    public void mouseClicked(final MouseEvent e) {
                        printDebugData(table);
                    }
                });
            }
            SAXBuilder sxb = new SAXBuilder();
            try {
                document = sxb.build(new File("CodesBarres.xml"));
            } catch (Exception e5) {
                e5.printStackTrace();
            }
            racine = document.getRootElement();
            System.out.println("racine " + racine);
            List listfichier = racine.getChildren("fichier");
            System.out.println(listfichier.size());
            Iterator i = listfichier.iterator();
            while (i.hasNext()) {
                Element courant = (Element) i.next();
                String[] rowData = {
                		courant.getChild("nom").getText(),
                        courant.getChild("IdClient").getText(),
                        courant.getChild("Type").getText(),
                        courant.getChild("Taille").getText(),
                        courant.getChild("DateEnvoi").getText(),
                        courant.getChild("AncienNom").getText()
                };
                ((DefaultTableModel) table.getModel()).addRow(rowData);
            }
            scrollPane = new JScrollPane(table);
            add(scrollPane);
        }
     
        private void printDebugData(final JTable table) {
            int numRows = table.getRowCount();
            int numCols = table.getColumnCount();
            javax.swing.table.TableModel model = table.getModel();
            System.out.println("Value of data: ");
            for (int i = 0; i < numRows; i++) {
                System.out.print("    row " + i + ":");
                for (int j = 0; j < numCols; j++) {
                    System.out.print("  " + model.getValueAt(i, j));
                }
                System.out.println();
            }
            System.out.println("--------------------------");
        }
     
        /**
         * Create the GUI and show it.  For thread safety,
         * this method should be invoked from the
         * event-dispatching thread.
         */
        private static void createAndShowGUI() {
            //Create and set up the window.
            JFrame frame = new JFrame("XmlJTable ");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            //Create and set up the content pane.
            XmlToJTabble newContentPane = new XmlToJTabble();
            newContentPane.setOpaque(true); //content panes must be opaque
            frame.setContentPane(newContentPane);
            //Display the window.
            frame.pack();
            frame.setVisible(true);
        }
     
        public static void main(final String[] args) {
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
     
                public void run() {
                    createAndShowGUI();
                }
            });
        }
    }

  18. #18
    Expert confirmé
    Affecte ton nouveau modèle (NonEditableDefaultTableModel ) à ta JTable via un setModel.

  19. #19
    Membre du Club
    Je met ça dans mon code du package Moteur, et ça me donne un JPanel vide.

    Comment on ajoute les données et les colonnes sans faire :
    new JTable( data , columns );
    ??

    lorsque columns et data sont des vector.

    J'ai bien vu la méthode addColumn( ) mais les types ne correspondent pas.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    table.setModel(new NonEditableDefaultTableModel() );

  20. #20
    Expert confirmé
    Il faut utiliser ton modèle pour modifier ou récupérer les données.
    Regarde le tuto de Sun:
    http://java.sun.com/docs/books/tutorial/uiswing/components/table.html

###raw>template_hook.ano_emploi###