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 :

JTable Est-ce possible de simuler Enter Key ?


Sujet :

Composants Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Par défaut JTable Est-ce possible de simuler Enter Key ?
    Bonjour,

    J'ai un petit problème d'utilisation d'une JTable, et je pense qu'il doit surement exister une solution. Je détaille :

    Imaginons que dans une cellule d'une JTable il y ait la valeur "TOTO" et que l'utilisateur modifie cette cellule en tapant la valeur "NINI". Par ailleurs j'ai défini un FocusListener et un listSelectionListener,

    Supposons que par oubli, au lieu de presser pas la touche "Entrée" pour terminer sa mise à jour, l'utilisateur presse sur un "JButton" pour passer (par exemple) à une fenêtre suivante, le contrôle est bien passé au FocusListener mais si la méthode associée (focusLost), essaie de lire le contenu de cette cellule par : monModel.getValueAt(i,j) on obtient "TOTO" et non pas la nouvelle valeur "NINI".

    Y-a-t-il une solution à ce problème pour forcer l'utilisateur à presser la touche entrée ou (à la simuler sur une cellule particulière). Est-ce qu'un KeyListener pourrait être utile ?

    Merci d'avance.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 352
    Par défaut
    Bonjour.
    Tu peux utiliser l'interface TextListener. C'est une interface qui permet de gérer les événements émis lors de la modification d'un champ de saisie.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Par défaut
    D'accord je vais essayer.

    Merci beaucoup

  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 : 56
    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
    Billets dans le blog
    2
    Par défaut
    Salut,

    @Kasko
    TextListener est un écouteur pour évenement de composant AWT (TextField, TextArea) : rien à voir avec une JTable qui est un composant Swing !

    @GérardMartinelli : je n'ai pas tout compris de ton problème, mais ça me semble être un problème de TableCellEditor (voir les méthodes cancelEditing et stopCellEditing).
    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
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 352
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Salut,
    @Kasko
    TextListener est un écouteur pour évenement de composant AWT (TextField, TextArea)
    Bonjour joel.drigo.
    Je suis parfaitement d'accord avec vous.
    En fait,je pensais que les cellules sont remplies via des zones de saisie et j'ai pas aussi prêté attention qu'il s'agit de SWING.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Par défaut
    Effectivement, j'ai essayé de voir du côté de TextListener, mais ni la JTable, ni le model ne permet ce type de listener.

    Voici un exemple de code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    package test;
     
    import java.awt.Color;
    import java.awt.Font;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.JButton;
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
    import javax.swing.JTextField;
    import javax.swing.JLabel;
    public class TestJTable extends JFrame  
    {
     
    	private static final long serialVersionUID = 1L;
    	private JScrollPane scroll;
    	private JTable MaTable;
    	String[] columnNames = {"Séq.", "Artère", "Adresse", "N°", "Bis/Te", "Quartier", "Année" };
        Object[][] data = {{"", "", "","", "", "", ""},{"", "", "","", "", "", ""} , {"", "", "","", "", "", ""}, {"", "", "","", "", "", ""}};  // 4 lignes
    	private DefaultTableModel model = new DefaultTableModel(data, columnNames);
    	int row=0, col =0;
    	private JTextField affichage;
     
        public TestJTable() 
        {
        	JPanel panneau = new JPanel();
        	this.setSize(533, 339);
    	panneau.setBounds(0, 0, 405, 202);
            getContentPane().add(panneau);
    	panneau.setLayout(null);
     
            MaTable = new JTable(model);
            scroll = new JScrollPane(MaTable);
            scroll.setBounds(0, 0, 527, 93);
            panneau.add( scroll);
     
            MaTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
            MaTable.getColumnModel().getColumn(0).setPreferredWidth(38);
            MaTable.getColumnModel().getColumn(1).setPreferredWidth(80);
            MaTable.getColumnModel().getColumn(2).setPreferredWidth(140);
            MaTable.getColumnModel().getColumn(3).setPreferredWidth(40);
            MaTable.getColumnModel().getColumn(4).setPreferredWidth(54);
            MaTable.getColumnModel().getColumn(5).setPreferredWidth(100);
            MaTable.getColumnModel().getColumn(6).setPreferredWidth(54);
            MaTable.setBackground(Color.orange);
            MaTable.setFont(new Font("Times New Roman", Font.BOLD,10));
     
            JLabel msg = new JLabel(" ");
            msg.setForeground(Color.RED);
            msg.setBounds(29, 224, 423, 21);
            panneau.add(msg);
     
            affichage = new JTextField();
            affichage.setBounds(139, 183, 229, 30);
            panneau.add(affichage);
            affichage.setColumns(10);
     
     
            JButton Lire = new JButton("Case suivante");
            Lire.setBounds(170, 250, 147, 30);
            panneau.add(Lire);
            Lire.addActionListener(new ActionListener() 
            {
             	public void actionPerformed(ActionEvent arg0) 
             	{
             		model.fireTableCellUpdated(row, col); // n'a aucun effet
             		String wk = (String) MaTable.getValueAt(row,col);
             		affichage.setText(wk);
             		msg.setText("Ligne : " + (row+1)  + "  Colonne : " + (col+1));
             		col++;
             		if (col >6)  {col=0; row++;}
             		if (row >3 )
             		{	
             			msg.setText("Toutes les cases sont lues. On repart à zéro.");
             			row=0; col =0;
             		}	
             	}
             });
     
             setVisible(true);
             setLocationRelativeTo(null);
        }
     
        public static void main(String args[]) throws Exception  
            { new TestJTable(); }
    	}
    Si je tape une nouvelle valeur dans une case, sans presser la touche "Entrée", puis que je clique n fois sur le bouton "Case suivante" pour lire le contenu de cette case, je n'arrive pas a lire ce que je viens de taper. Je récupère l'ancienne valeur.

    Si vous souhaitez faire le test je vous suggère le scénario suivant :
    1) Dans les deux premières cases entrez une valeur par exemple AAAA et BBBB
    2) pressez la touche "Entrée"
    3) Modifiez la case ligne 1 colonne 2 (à la place de BBBB par exemple, tapez CCCC mais ne pressez pas la touche Entrée
    4) cliquez sur le bouton "Case suivante" deux fois. Pour la ligne 1 et colonne 2 vous obtenez BBBB et non CCCC

  7. #7
    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 : 56
    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
    Billets dans le blog
    2
    Par défaut
    Normal, que model.fireTableCellUpdated(row, col); n'ait aucun effet : ça ne fait qu'avertir la JTable qu'une celule a été modifiée dans le modèle. Or tant que l'édition n'est pas validée, le modèle n'est pas modifié.

    Supprime cette ligne, et fait, à la place :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TableCellEditor cellEditor = MaTable.getCellEditor();
             		if ( cellEditor!=null && !cellEditor.stopCellEditing() ) {
             			// edition non validée !
             		}
    Le bloc exécuté correspondant au commentaire "// edition non validée !" correspond au cas où la valeur actuellement saisie n'a pas été acceptée : normalement dans ce cas, tu ne devrais pas exécuter l'action, mais afficher un message d'erreur, ou alors tu affiches un message de confirmation qui stipule que si l'action est effectuée la dernière saisie, étant invalide, ne sera pas prise en compte.
    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.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Par défaut
    Merci Joel, ça marche impec maintenant.

    Par contre il y a quelque chose que je n'ai pas compris : "dans quel cas ce que l'on tape risque de ne pas être accepté ?". Car effectivement j'ai ajouté un message dans le bloc et celui-ci n'est jamais affiché.

    Encore merci

    Gégé

  9. #9
    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 : 56
    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
    Billets dans le blog
    2
    Par défaut
    Quand la valeur n'est pas acceptée ? Et bien, ça dépend des éditeurs qui sont affectés à la JTable.

    Pour les éditeurs par défaut, on peut s'en faire une idée en regardant le code du GenericEditor par exemple:
    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
    public boolean stopCellEditing() {
                String s = (String)super.getCellEditorValue();
                // Here we are dealing with the case where a user
                // has deleted the string value in a cell, possibly
                // after a failed validation. Return null, so that
                // they have the option to replace the value with
                // null or use escape to restore the original.
                // For Strings, return "" for backward compatibility.
                try {
                    if ("".equals(s)) {
                        if (constructor.getDeclaringClass() == String.class) {
                            value = s;
                        }
                        return super.stopCellEditing();
                    }
     
                    SwingUtilities2.checkAccess(constructor.getModifiers());
                    value = constructor.newInstance(new Object[]{s});
                }
                catch (Exception e) {
                    ((JComponent)getComponent()).setBorder(new LineBorder(Color.red));
                    return false;
                }
                return super.stopCellEditing();
            }
    On voit que la valeur est produite par réflexion, via le newInstance (du constructeur à argument de type String), et toute exception donne lieu à invalidation (par exemple, si la colonne est du type Integer, tu auras invalidation si la saisie contient des lettres).
    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.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Par défaut
    Ah OK, j'ai compris. Merci encore de ton aide si rapide

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

Discussions similaires

  1. Est-il possible de simuler la combinaison de touches CTRL + F5 ?
    Par beegees dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 02/08/2009, 18h30
  2. Réponses: 6
    Dernier message: 02/03/2009, 12h21
  3. Est-il possible de simuler la méthode post?
    Par hamidap dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 24/02/2009, 16h09
  4. Réponses: 8
    Dernier message: 18/08/2008, 21h18
  5. Est-il possible de simuler l'absence de réseau
    Par yodutouf dans le forum Java ME
    Réponses: 1
    Dernier message: 31/01/2008, 10h34

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