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 :

Listener de KeyEvent sur JTable vide


Sujet :

Composants Java

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 200
    Points : 149
    Points
    149
    Par défaut Listener de KeyEvent sur JTable vide
    Bonjour à tous,

    J'ai un léger souci sur une JTable. En effet, j'ai redéfini la méthode suivante dans ma 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
    	@Override
    	protected boolean processKeyBinding(KeyStroke ks, KeyEvent e, int condition, boolean pressed) {
    		boolean result = false;
    		if (pasteActionListener != null && !isEditing() && ks.equals(KeyStroke.getKeyStroke("ctrl pressed V"))) {
    			if (e.getWhen() - lastKeyAction > MIN_PASTE_INTERVAL) {
    				final ActionEvent pEvent = new ActionEvent(this, ActionEvent.ACTION_FIRST, PASTE_COMMAND);
    				pasteActionListener.actionPerformed(pEvent);
    				result = true;
    				e.consume();
    			}
    			lastKeyAction = e.getWhen();
    		} else {
    			result = super.processKeyBinding(ks, e, condition, pressed);
    		}
    		return result;
    	}
    Lorsque ma table a le focus aucun problèmes. Cependant, lorsque ma table est vide, il m'est impossible de coller des données par le biais d'un raccourci clavier car je ne passe jamais dans cette méthode... Quelqu'un a-t-il une idée du composant qui devrait écouter le clavier lorsqu'une JTable est vide ?

    Merci d'avance !

  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,

    Cela me semble étrange : la réception des touches du clavier ne dépend que du fait que le composant ait le focus. Une table vide avec le focus reçoit bien les évènements clavier. Il y a d'autres composants dans ta vue ? Une gestion particulière du focus ? Un code plus complet nous permettrait de nous faire une idée du contexte.
    Par ailleurs, pour une implémentation globale ne tenant pas compte du focus, tu pourrais peut-être intervenir directement dans le KeyboardFocusManager (DefaultKeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher()).
    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
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 200
    Points : 149
    Points
    149
    Par défaut
    Salut,
    Cela me semble étrange : la réception des touches du clavier ne dépend que du fait que le composant ait le focus
    Justement, j'ai l'impression qu'il n'y a pas de focus possible sur un JTable vide... J'ai un autre listener héritant d'un KeyAdapter dans le code mais là non plus il n'y a aucun évènement clavier qui passe... Pourtant ce KeyAdapter est ajouté à la table par le biais de la méthode addKeyListener et il ne se déclenche pas !
    tu pourrais peut-être intervenir directement dans le KeyboardFocusManager (DefaultKeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher())
    Je viens de tester à l'endroit de mon KeyAdapter, j'ai ajouté un KeyEventDispatcher:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    DefaultKeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() {
     
    			@Override
    			public boolean dispatchKeyEvent(KeyEvent event) {
    				boolean result = false;
    				if (event.isControlDown() && (event.getKeyCode() == KeyEvent.VK_C || event.getKeyCode() == KeyEvent.VK_V)) {
    					keyPressed(event);
    					result = true;
    				}
    				return result;
    			}
    		});
    Et là bizarrement ça fonctionne ! Je me demande s'il n'y a pas quelque chose avec le GlassPane dans l'histoire ? Lorsque qu'une table est vide à mon sens, c'est comme un JPanel, il ne peut pas avoir le focus puisqu'il n'y a rien dedans et en l'occurrence, lorsque ma table est vide, seul le header est affiché mais pour le reste je présume que c'est le JScrollPane conteneur de la table qui est affiché. J'avais également mis surchargé la méthode processKeyBinding dans le JScrollPane mais ça n'avais rien donné...

  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
    Citation Envoyé par Dark_TeToN Voir le message
    Je viens de tester à l'endroit de mon KeyAdapter, j'ai ajouté un KeyEventDispatcher: [...]
    Et là bizarrement ça fonctionne !
    Parce que çà ne fonctionne pas par rapport au focus. Le KeyEventDispatcher de base transmet justement les évènements au composant qui a le focus.

    Citation Envoyé par Dark_TeToN Voir le message
    Je me demande s'il n'y a pas quelque chose avec le GlassPane dans l'histoire ?
    Parce que tu gères un GlassPane ?

    Citation Envoyé par Dark_TeToN Voir le message
    Lorsque qu'une table est vide à mon sens, c'est comme un JPanel, il ne peut pas avoir le focus puisqu'il n'y a rien dedans et en l'occurrence, lorsque ma table est vide, seul le header est affiché mais pour le reste je présume que c'est le JScrollPane conteneur de la table qui est affiché. J'avais également mis surchargé la méthode processKeyBinding dans le JScrollPane mais ça n'avais rien donné...
    J'ai testé justement, pour être sûr (une JTable vide dans un JScrollPane dans le content pane), en Java 8/Windows 10, et ça fonctionne.
    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 habitué
    Inscrit en
    Octobre 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 200
    Points : 149
    Points
    149
    Par défaut
    Parce que tu gères un GlassPane ?
    Non je ne gère pas le GlassPane mais du coup j'ai compris le problème, du moins je pense.

    En fait lorsque ma JTable est vide elle ne peut pas avoir le focus apparemment, et seul le JScrollPane est affiché. Du coup j'ai ajouté un MouseListener sur le JScrollPane et lorsque que l'utilisateur clique sur le composant, je fait un requestFocusInWindow(). J'ai fait la même chose pour tester sur ma JTable mais je ne passe jamais dedans.
    Du coup depuis le JScrollPane je transmet l'évènement pour coller les données et le tour est joué !

    Cependant comme l'application est quand même conséquente, je présume qu'il doit y avoir quelque chose qui fait que ma JTable n'a pas le focus, mais je n'arrive pas à trouver pourquoi !
    Typiquement pour voir j'ai un autre composant Swing au-dessus de ma JTable et lorsque je clique dessus le focus est bien pris mais si je cliquai n'importe où sur ma table le focus n'étais jamais récupéré... Pourquoi, c'est ça que j'aimerai bien savoir ! Mon opinion sur le sujet est qu'un JScrollPane ne prend jamais le focus lorsque (de-même qu'un JPanel) et comme ma table est vide c'est le JScrollPane qui est affiché, c'est je pense la raison pour laquelle cela ne fonctionnait pas !
    Est-ce bien cela ?
    Au passage, lorsque je dis que ma table est vide, je pense qu'on s'est compris mais je préfère le préciser au cas où : il n'y a aucune ligne dedans, pas même une ligne non-remplie ! Juste le header...

  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
    Citation Envoyé par Dark_TeToN Voir le message
    Au passage, lorsque je dis que ma table est vide, je pense qu'on s'est compris mais je préfère le préciser au cas où : il n'y a aucune ligne dedans, pas même une ligne non-remplie ! Juste le header...
    Oui, oui, c'est bien comme ça que je l'ai compris (new JTable(new Object[][3], new String[]{"col1","col2","col3"}) par exemple).

    Citation Envoyé par Dark_TeToN Voir le message
    Typiquement pour voir j'ai un autre composant Swing au-dessus de ma JTable et lorsque je clique dessus le focus est bien pris mais si je cliquai n'importe où sur ma table le focus n'étais jamais récupéré...
    As-tu essayé avec table.setFillsViewportHeight(true) ?

    Citation Envoyé par Dark_TeToN Voir le message
    Pourquoi, c'est ça que j'aimerai bien savoir ! Mon opinion sur le sujet est qu'un JScrollPane ne prend jamais le focus lorsque (de-même qu'un JPanel) et comme ma table est vide c'est le JScrollPane qui est affiché, c'est je pense la raison pour laquelle cela ne fonctionnait pas !
    Est-ce bien cela ?
    Je n'arrive pas à reproduire et je ne vois pas comme ça quelle circonstance pourrait expliquer ce (dys)fonctionnement.
    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
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 200
    Points : 149
    Points
    149
    Par défaut
    As-tu essayé avec table.setFillsViewportHeight(true) ?
    MERCI !!!!

    Il était en effet setté à false mais je n'avais pas du tout fait le rapprochement ! Maintenant cela parait logique ! Puisque lorsque je cliquais c'étais le ScrollPane qui avait le focus... Comme la table ne remplissais pas la vue, je ne risquais pas effectivement qu'elle le prenne !

    Tout fonctionne ! Un GRAND MERCI A TOI !

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

Discussions similaires

  1. Listener sur JTable
    Par calypso dans le forum Composants
    Réponses: 3
    Dernier message: 05/02/2009, 16h27
  2. [JTable] Affichage d'un popup sur un JTable vide.
    Par Invité dans le forum Composants
    Réponses: 1
    Dernier message: 08/09/2008, 16h25
  3. [jTable] Gérer clik droit sur une jTable vide
    Par serwol dans le forum Composants
    Réponses: 4
    Dernier message: 01/12/2005, 10h06
  4. [JTable] Créer une JTable vide avec des noms de colonnes.
    Par Cyborg289 dans le forum Composants
    Réponses: 2
    Dernier message: 27/09/2005, 15h54
  5. Requete sur champ vide
    Par Eltaz dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/06/2005, 13h36

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