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 :

Evénement de mise a jour de cellule JTable


Sujet :

Composants Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 74
    Points : 31
    Points
    31
    Par défaut Evénement de mise a jour de cellule JTable
    Bonjour à tout le monde,

    J'ai fait une petite application de gestion de stock. Les informations des produits seront entrés dans un JTable avec le clavier ou bien avec un lecteur code barre. Mon problème est que je veux mon JTable déclenche un évènement au fur et a mesure que la valeur d'une cellule est changée comme caretupdate de JTextField.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    On peut écouter les changements d'états des éditeurs de JTable par l'écouteur CellEditorListener, à enregistrer au près de l'instance de TableCellEditor adéquate. Cela permet en revanche uniquement de savoir si une modification est validée ou annulée, pas d'analyser la frappe au fur et à mesure. On ne peut pas plus, parce qu'un TableCellEditor est générique : cela peut être un JTextField, ou un JCheckBox, ou n'importe quoi d'autres (même une JTable si on veut).

    L'écouteur CaretListener ne permet pas d'écouter les changements de saisie dans un JTextField mais les déplacements du curseur. On peut détourner cet écouteur pour analyser la saisie au fur et à mesure, mais il est bien plus judicieux et simple d'utiliser un DocumentListener (field.getDocument().addDocumentListener(new DocumentListener() {/*...*/});) ou encore un InputVerifier (field.setInputVerifier(new InputVerifier(){/*...*/})) s'il s'agit de faire de la validation en particulier.

    Si les évenements du CellEditorListener ne te suffisent pas pour faire ce que tu as à faire, tu peux faire ton propre TableCellEditor. Par exemple, en partant d'un DefaultCellEditor, ça pourra être très simple :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    JTextField textField = new JTextField();
    // ici tu ajoutes tous les écouteurs que tu veux sur le textField;
    DefaultCellEditor cellEditor = new DefaultCellEditor(textField); // on créé un éditeur par défaut avec le JTextField précédemment défini
    table.getColumnModel().getColumn(columnIndex).setCellEditor(cellEditor); // par exemple, pour affecter l'éditeur sur la colonne d'index columnIndex
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 74
    Points : 31
    Points
    31
    Par défaut
    Merci pour votre réponse.
    J'utilise ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TableColumn soprtColumn = jTable1.getColumnModel().getColumn(2);
    soprtColumn.setCellEditor(new DefaultCellEditor(jTextField1));
    jTable1.setCellSelectionEnabled(false);
    pour mettre une jtextField et tout à fait bien.
    Mais des fois, la cellule qui contient le JTextField n'affiche pas ce qui est vraiment dans la cellule de table puisque le JTextField est mis à jour par moi-même et lorsque le jtable miet a jour le JTextField, il reste non modifié.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Il ne faut surtout pas toucher au contenu du JTextField (ou alors il faut bien maitriser le fonctionnement de la saisie).

    Il faudrait que j'en sache plus ce que tu cherches à faire exactement et ce que tu fais (comment tu réalises ce que tu cherches à faire... montre ton code en particulier)
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 74
    Points : 31
    Points
    31
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Il ne faut surtout pas toucher au contenu du JTextField (ou alors il faut bien maitriser le fonctionnement de la saisie).

    Il faudrait que j'en sache plus ce que tu cherches à faire exactement et ce que tu fais (comment tu réalises ce que tu cherches à faire... montre ton code en particulier)
    bon j'ai fait une petite exemple pour être facile à comprendre qui montre mon probleme:
    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
    public class Exo {
     
        private String title[] = {"code", "nom", "qte"};
        Hashtable base = new Hashtable();
        Hashtable liste = new Hashtable();
        DefaultTableModel mod;
        JTextField tf;
     
        public Exo() {
     
            base.put("10", "10&sourie&1");
            base.put("20", "20&clavier&1");
            base.put("30", "30&ecron&1");
     
            JFrame f = new JFrame();
            f.setBounds(0, 0, 400, 400);
            f.setLayout(null);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            mod = new DefaultTableModel(null, title);
            final JTable table = new JTable(mod);
            JScrollPane sc = new JScrollPane(table);
            sc.setBounds(10, 10, 350, 350);
            tf = new JTextField();
            tf.getDocument().addDocumentListener(new DocumentListener() {
                public void changedUpdate(DocumentEvent e) {
                }
                public void removeUpdate(DocumentEvent e) {
                }
                public void insertUpdate(DocumentEvent e) {
                    save();
                }
            });
            TableColumn soprtColumn = table.getColumnModel().getColumn(0);
            soprtColumn.setCellEditor(new DefaultCellEditor(tf));
            table.setCellSelectionEnabled(false);
            mod.addRow(new Vector());
            f.add(sc);
            f.setVisible(true);
        }
     
        public void save() {
            String prod = (String) base.get(tf.getText());
            int qte = 1;
            if (prod != null) {
                String tab[] = prod.split("&");
                if (liste.containsKey(tab[0])) {
                    qte = qte + 1;
                    String value = tab[0] + "&" + tab[1] + "&" + qte;
                    liste.remove(tab[0]);
                    liste.put(tab[0], value);
                } else {
                    qte = 1;
                    String value = tab[0] + "&" + tab[1] + "&" + qte;
                    liste.put(tab[0], value);
                }
                actualiser();
            }
        }
     
        public void actualiser() {
            mod.setNumRows(0);
            Enumeration en = liste.elements();
            while (en.hasMoreElements()) {
                String value = (String) en.nextElement();
                String[] tab = value.split("&");
                Object data[] = {tab[0], tab[1], tab[2]};
                mod.addRow(data);
            }
            mod.addRow(new Vector());
        }
     
        public static void main(String[] args) {
            new Exo();
        }
    }
    Nom : Sans titre.png
Affichages : 672
Taille : 24,0 Ko

    lorsque je saisie 10, la table met a jours normalement.
    lorsque j'efface 10 et la remplacer par 20, la table met a jour mais la colonne code affiche 20 et 20 au lieu des 10 et 20.
    en plus je veux que lorsque la table met a jour le curseur se placer dans la cellule suivante de la colonne code.
    merci d'avance.

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Le problème est que tu changes le contenu du modèle (tu supprimes tout et réinsères) pendant l'édition. En plus tu stockes tes données dans des Hashtable (au passage, tu devrais plutôt utiliser une HashMap), l'ordre n'est pas garanti et la ligne en cours de saisie peut changer, donc devenir complètement incohérente par rapport à la donnée en cours de saisie.
    Essaye déjà de forcer la fin de l'édition, par table.getCellEditor().stopCellEditing().
    Ensuite, arrange-toi pour ne pas supprimer tout pour tout réinsérer, mais ajoute juste la nouvelle ligne.

    Par ailleurs, tu peux gérer le changement de cellule éditée par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    table.changeSelection(row, col, false, false);
    table.editCellAt(row, col);
    Autres points :
    1. Map<String, String> base = new HashMap<>();.
      Plus besoin de caster :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      String prod = base.get(tf.getText());
    2. Je pense que le code suivant ne fonctionne pas :
      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
      int qte = 1;
              if (prod != null) {
                  String tab[] = prod.split("&");
                  if (liste.containsKey(tab[0])) {
                      qte = qte + 1;
                      String value = tab[0] + "&" + tab[1] + "&" + qte;
                      liste.remove(tab[0]);
                      liste.put(tab[0], value);
                  } else {
                      qte = 1;
                      String value = tab[0] + "&" + tab[1] + "&" + qte;
                      liste.put(tab[0], value);
                  }
                  actualiser();
              }
      qte vaut toujours soit 1, soit 2. Alors que je suppose que tu voudrais que qte s'incrémente à chaque fois que la valeur est déjà saisie. Donc il faudrait reparser la ligne contenue dans liste. Plutôt faire une classe qui représente ton objet, en conséquence au lieu de parser et concaténer à chaque fois.
      Au passage :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      liste.remove(tab[0]);
      liste.put(tab[0], value);
      Le remove ne sert à rien : le put remplacera le précédent mapping.
    3. f.setLayout(null); .
      de préférence ne pas supprimer le layoutmanager et éviter de forcer les positions et tailles en dur.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 74
    Points : 31
    Points
    31
    Par défaut
    merci pour votre réponse.
    bon ,
    1- cette classe n'est pas ma propre classe de projet c'est un prototype très simple juste pour t'expliquer mon problème et par conséquent le hashtable qui s'appelle base représente une base de données chez mon projet .
    2- la méthode actualiser() est presque la même que ce qui est dans le projet en utilisant un hashtable liste.
    3- je suis obligé de supprimer le modèle de la table a chaque mise à jour pour éviter la redondance.
    4- si c'est possible et s'il y a d'autres solutions, fais les correction sur la classe exo pour bien te comprendre. et merci , et je m'excuse puisque j'ai posé baucoup de questions

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Ok, je vois. Tu ne m'avais pas dit que les données devaient passer par une base. D'un autre côté, si j'ai bien conscience que ce n'est pas simple à gérer, ça ne t'oblige absolument pas à supprimer toutes tes données de la JTable pour les remettre après. Il faudrait faire une comparaison de différentiel. Mais admettons que pour simplifier on procède comme ça.
    Tu ne peux de toute manière pas modifier les données pendant qu'une édition est en cours. Il te suffit donc simplement de forcer l'arrêt de l'édition, comme je te l'ai indiqué.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  9. #9
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 74
    Points : 31
    Points
    31
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Ok, je vois. Tu ne m'avais pas dit que les données devaient passer par une base. D'un autre côté, si j'ai bien conscience que ce n'est pas simple à gérer, ça ne t'oblige absolument pas à supprimer toutes tes données de la JTable pour les remettre après. Il faudrait faire une comparaison de différentiel. Mais admettons que pour simplifier on procède comme ça.
    Tu ne peux de toute manière pas modifier les données pendant qu'une édition est en cours. Il te suffit donc simplement de forcer l'arrêt de l'édition, comme je te l'ai indiqué.
    j'ai essayé de modifier la methode actualiser() comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public void actualiser() {
            mod.setNumRows(0);
            Enumeration en = liste.elements();
            while (en.hasMoreElements()) {
                String value = (String) en.nextElement();
                String[] tab = value.split("&");
                Object data[] = {tab[0], tab[1], tab[2]};
                mod.addRow(data);
            }
            mod.addRow(new Vector());
            table.getCellEditor().stopCellEditing();
            table.changeSelection(table.getSelectedRow(), 0, false, false);
            table.editCellAt(table.getRowCount()-1, 0);
        }
    mais le curseur ne peut pas se placer dans la cellule qui se transforme en jtextField (la colonne 0),par contre si je change la colonne toutes est fonctionné bien et moi je suis obligé de se placer dans les cellules de la colonne 0 (code).
    si c'est possible donnez moi le code de la classe Exo avec les modifications nécessaires. et merci d'avance .

  10. #10
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    J'ai fait ça vite fait, pas testé (j'ai marqué en jaune les modifs que j'ai faites):

    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
    public class Exo {
     
        private String title[] = {"code", "nom", "qte"};
        Hashtable base = new Hashtable();
        Hashtable liste = new Hashtable();
        JTable table;
        DefaultTableModel mod;
        JTextField tf;
     
        public Exo() {
     
            base.put("10", "10&sourie&1");
            base.put("20", "20&clavier&1");
            base.put("30", "30&ecron&1");
     
            JFrame f = new JFrame();
            f.setBounds(0, 0, 400, 400);
            f.setLayout(null);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            mod = new DefaultTableModel(null, title);
            table = new JTable(mod);
            JScrollPane sc = new JScrollPane(table);
            sc.setBounds(10, 10, 350, 350);
            tf = new JTextField(); 
            TableColumn soprtColumn = table.getColumnModel().getColumn(0); 
            soprtColumn.setCellEditor(new DefaultCellEditor(tf));
            tf.getDocument().addDocumentListener(new DocumentListener() {
                public void changedUpdate(DocumentEvent e) {
                }
                public void removeUpdate(DocumentEvent e) {
                }
                public void insertUpdate(DocumentEvent e) {
                	if ( table.isEditing() ) { 
                		save();
                	}
                }
            }); 
            table.setCellSelectionEnabled(false);
            mod.addRow(new Vector());
            f.add(sc);
            f.setVisible(true);
        }
     
        public void save() {
            String prod = (String) base.get(tf.getText());
            int qte = 1;
            if (prod != null) {
            	TableCellEditor editor = table.getCellEditor();
            	if ( editor!=null ) editor.stopCellEditing();
                String tab[] = prod.split("&");
                if (liste.containsKey(tab[0])) {
                    qte = qte + 1;
                    String value = tab[0] + "&" + tab[1] + "&" + qte;
                    liste.remove(tab[0]);
                    liste.put(tab[0], value);
                } else {
                    qte = 1;
                    String value = tab[0] + "&" + tab[1] + "&" + qte;
                    liste.put(tab[0], value);
                }
                actualiser();
            }
        }
     
        public void actualiser() {
            mod.setNumRows(0);
            Enumeration en = liste.elements();
            while (en.hasMoreElements()) {
                String value = (String) en.nextElement();
                String[] tab = value.split("&");
                Object data[] = {tab[0], tab[1], tab[2]};
                mod.addRow(data);
            }
            mod.addRow(new Vector());
            SwingUtilities.invokeLater(()->{
                table.changeSelection(mod.getRowCount()-1, 0, false, false);
                table.editCellAt(mod.getRowCount()-1, 0);
            });
        }
     
        public static void main(String[] args) {
            new Exo();
        }
    }
    Variante si tu veux que la saisie remplace la saisie précédente dans la cellule :

    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
    public class Exo {
     
        private String title[] = {"code", "nom", "qte"};
        Hashtable base = new Hashtable();
        Hashtable liste = new Hashtable();
        JTable table;
        DefaultTableModel mod;
        JTextField tf;
     
        public Exo() {
     
            base.put("10", "10&sourie&1");
            base.put("20", "20&clavier&1");
            base.put("30", "30&ecron&1");
     
            JFrame f = new JFrame();
            f.setBounds(0, 0, 400, 400);
            f.setLayout(null);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            mod = new DefaultTableModel(null, title);
            table = new JTable(mod) {
            	@Override // Always selectAll()
                public boolean editCellAt(int row, int column, EventObject e) {
                    boolean result = super.editCellAt(row, column, e);
                    final Component editor = getEditorComponent();
                    if (editor == null || !(editor instanceof JTextComponent)) {
                        return result;
                    }
                    ((JTextComponent) editor).selectAll();
                    return result;
                }
            };
            JScrollPane sc = new JScrollPane(table);
            sc.setBounds(10, 10, 350, 350);
            tf = new JTextField(); 
            TableColumn soprtColumn = table.getColumnModel().getColumn(0); 
            soprtColumn.setCellEditor(new DefaultCellEditor(tf));
            tf.getDocument().addDocumentListener(new DocumentListener() {
                public void changedUpdate(DocumentEvent e) {
                }
                public void removeUpdate(DocumentEvent e) {
                }
                public void insertUpdate(DocumentEvent e) {
                	if ( table.isEditing() ) { 
                		save();
                	}
                }
            }); 
            table.setCellSelectionEnabled(false);
            mod.addRow(new Vector());
            f.add(sc);
            f.setVisible(true);
        }
     
        public void save() {
            String prod = (String) base.get(tf.getText());
            int qte = 1;
            if (prod != null) {
            	TableCellEditor editor = table.getCellEditor();
            	if ( editor!=null ) editor.stopCellEditing();
                String tab[] = prod.split("&");
                if (liste.containsKey(tab[0])) {
                    qte = qte + 1;
                    String value = tab[0] + "&" + tab[1] + "&" + qte;
                    liste.remove(tab[0]);
                    liste.put(tab[0], value);
                } else {
                    qte = 1;
                    String value = tab[0] + "&" + tab[1] + "&" + qte;
                    liste.put(tab[0], value);
                }
                actualiser();
            }
        }
     
        public void actualiser() {
            mod.setNumRows(0);
            Enumeration en = liste.elements();
            while (en.hasMoreElements()) {
                String value = (String) en.nextElement();
                String[] tab = value.split("&");
                Object data[] = {tab[0], tab[1], tab[2]};
                mod.addRow(data);
            }
            mod.addRow(new Vector());
            SwingUtilities.invokeLater(()->{
                table.changeSelection(mod.getRowCount()-1, 0, false, false);
                table.editCellAt(mod.getRowCount()-1, 0);
            });
        }
     
        public static void main(String[] args) {
            new Exo();
        }
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  11. #11
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 74
    Points : 31
    Points
    31
    Par défaut
    j'ai pas compris ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SwingUtilities.invokeLater(()->{
                table.changeSelection(mod.getRowCount()-1, 0, false, false);
                table.editCellAt(mod.getRowCount()-1, 0);
            });

  12. #12
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    L'invokeLater permet d'exécuter le code plus tard sur l'Event Dispatch Thread (le thread Swing). Le code effectue tout d'abord la sélection de la première cellule de la nouvelle ligne ajoutée, puis la met en mode édition (c'est ce qui permet à ce que la saisie passe sur la nouvelle première cellule de la nouvelle ligne).
    On est obligé de l'exécuté en "later" parce que comme on est en mode édition, dans un évenement de l'éditeur, on ne peut pas changer la sélection sans provoquer une exception (contrôle d'intégrités Swing).
    Sinon, la syntaxe utilise une expression lambda qui simplifie le code. Sans expression lambda, on aurait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SwingUtilities.invokeLater(new Runnable() {
     
        public void run() {
               table.changeSelection(mod.getRowCount()-1, 0, false, false);
               table.editCellAt(mod.getRowCount()-1, 0);
        }
     
    });
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  13. #13
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 74
    Points : 31
    Points
    31
    Par défaut
    merci beaucoup joel.drigo vous m'avez aidé vraiment .

  14. #14
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 74
    Points : 31
    Points
    31
    Par défaut
    Citation Envoyé par riyad25h Voir le message
    merci beaucoup joel.drigo vous m'avez aidé vraiment .
    bon, une autre petite question comment placer le curseur dans la cellule (0,0) du tableau en exécutant le programme. j'ai essayé avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            jTable1.editCellAt(0, 0);                // ligne zéro, colonne 2
    juste la case sélectionné mais lors de frappe avec le clavier rien est écrit.

  15. #15
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Dans ce code, les deux lignes sont indispensables (si tu n'as pas la première, la seconde ne fonctionnera pas si la sélection n'est pas la cellule éditée) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SwingUtilities.invokeLater(new Runnable() {
     
        public void run() {
               table.changeSelection(mod.getRowCount()-1, 0, false, false);
               table.editCellAt(mod.getRowCount()-1, 0);
        }
     
    });
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  16. #16
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 74
    Points : 31
    Points
    31
    Par défaut
    merci joel.drigo beaucoup.
    j'ai trouvé la faute. le problème est que le composant jtable n'est pas le composant actif. puisque j'ai beaucoup de composants dans ma fenêtre.
    lorsque j'ai essayé avec une fenetre qui ne contient q'un jtable l'instruction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    table.changeSelection(0, 0, false, false);
            table.requestFocus();
    fait l'essentielle.
    donc moi je dois chercher comment rendre un composant d'une fenêtre comme le 1er composant actif. (je veux dire celui qui est collectionné)

  17. #17
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Il faut que tu gères ton propre "FocusTraversalPolicy"... regarde ce tutoriel : http://baptiste-wicht.developpez.com...a/swing/focus/
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  18. #18
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 74
    Points : 31
    Points
    31
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Il faut que tu gères ton propre "FocusTraversalPolicy"... regarde ce tutoriel : http://baptiste-wicht.developpez.com...a/swing/focus/
    j'ai essayé avec les exo de ce tuto mais pas de solution, si c'est possible donnez moi un exo avec le code.

  19. #19
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Et c'est quoi ce que tu as essayé ? C'est quoi au juste que tu cherches comme comportement ? Que la JTable prennent systématiquement le focus après que n'importe quel composant le perde ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  20. #20
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 74
    Points : 31
    Points
    31
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Et c'est quoi ce que tu as essayé ? C'est quoi au juste que tu cherches comme comportement ? Que la JTable prennent systématiquement le focus après que n'importe quel composant le perde ?
    je veux qu'une cellule précise (x,y) de Jtable prennent le Focus lorsque la fenêtre afficher.

Discussions similaires

  1. Mise à jour cellule JTable
    Par RomG7 dans le forum Composants
    Réponses: 1
    Dernier message: 06/06/2013, 09h36
  2. mise a jour d'une Jtable
    Par boumacmilan dans le forum Composants
    Réponses: 1
    Dernier message: 22/06/2009, 11h35
  3. Problème de mise a jours d'une JTable
    Par vinzzzz dans le forum Composants
    Réponses: 9
    Dernier message: 01/06/2009, 10h05
  4. Requete mise a jour si cellule vide
    Par Percevan dans le forum Requêtes et SQL.
    Réponses: 25
    Dernier message: 31/08/2007, 18h38
  5. mise à jour d'une JTable ?
    Par Sakalam dans le forum Composants
    Réponses: 11
    Dernier message: 15/09/2006, 15h06

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