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

AWT/Swing Java Discussion :

Problème Focus Java


Sujet :

AWT/Swing Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 10
    Points : 6
    Points
    6
    Par défaut Problème Focus Java
    Bonjour la communauté developpez.net, aujourd'hui je viens à vous suite à une semaine de recherche à cause d'un soucis dans un de mes programmes. Le focus étant un terme nouveau pour moi je ne sais pas si je me dirige vers la bonne direction. Mon programme est un petit logiciel basique de traitement de texte lorsque j'écris un début de mot. J'ai un JPopUpMenu contenant une JList de plusieurs mots afin de compléter le mot que je tape





    Mon problème est lorsque je veux utiliser les touches directionnelles, elle ne seront pas utilisées pour parcourir la JList mais le TextArea et le menu contextuel s'enlèvera. J'ai essaye de mettre lorsque l'on utilise les fleches haut ou bas un requestFocus() sur la JList mais en vain.



    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 void keyPressed(KeyEvent e){
     
        	//System.out.println("CODE EVENEMENT : "+e.getKeyCode());
        	if(e.getKeyCode()==38){
        		if(T105.pop.isVisible()){
        			T105.liste.requestFocus();
        		}
        		T105.liste.requestFocusInWindow();
        		System.out.println("FLECHE DU HAUT");
        		//System.out.println(T105.liste.isFocusable());
        	}
        	if(e.getKeyCode()==40){
        		if(T105.liste.isVisible()){
        			T105.liste.requestFocus();
        		}
        		T105.liste.requestFocusInWindow();
        		System.out.println("FLECHE DU BAS");
        		T105.liste.requestFocus();
        	}
    Voilà la partie de mon code où j'ai essayé de mettre le focus (je l'ai mis aussi InWindows pour essayer même si je ne sais pas forcément ce que ceci fait le Focus est une nouvelle notion pour moi). S'il faut j'afficherai le code entier de mon projet. Je vous remercie d'avance d'avoir prêté attention à mon sujet et vous souhaite une agréable journée

  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,

    Déjà ici c'est Developpez.net

    Ensuite, au lieu de jouer avec le focus, qui ne fera pas de toute façon que la touche soit traitée par la JList dans ta popup (puisque l'évenement n'a été capté que par la JTextArea), tu devrais simplement changer la sélection directement dans la JList. En plus, pense à brûler l'évenement pour qu'il ne soit pas traité par le JTextArea.

    Quelque chose 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 keyPressed(KeyEvent e){
     
        	if(e.getKeyCode()==KeyEvent.VK_DOWN || e.getKeyCode()==KeyEvent.VK_KP_DOWN ) {
     
                    if(T105.pop.isVisible()){
                       // ce serait mieux de regrouper ce code dans une méthode de "pop" (genre selectionSuivante())
                       int selectionIndex = T105.pop.list.getSelectedIndex();
    		   if ( selectionIndex<T105.pop.list.getModel().getSize() ) {
    			T105.pop.list.setSelectedIndex(selectionIndex+1);
    		   }
                       e.consume(); // brûle l'évenement pour qu'il ne soit pas traité par les autres keyListeners
                    }
            )
            ...
    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
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Bonjour, tout d'abords excusez moi pour cette faute je viens d'éditer mon message. Donc suite à vos conseils j'abandonne l'idée d'utiliser un focus. J'ai suivi votre code en ayant fait les changements nécessaires ( par exemple en changeant T105.pop.list.getSelectedIndex() par T105.list.getSelectedIndex() etc.. ) Le problème persiste toujours. Le menu contextuel disparaît toujours lors qu'une Jlist dans la JPopUpMenu apparaît. L'évenement est quand même traité par le JTextArea malgrès l'appel de la méthode consume().
    Merci d'avoir répondu !

  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
    Je n'avais pas compris qu'il y avait un menu contextuel en plus de ta popup (on ne le voit pas sur ta copie d'écran...).
    La gestion d'un popupmenu est spéciale : il ne prend pas vraiment le focus, c'est le rootpane de la JFrame qui prend le focus et le fait perdre au textarea.

    On peut redonner le focus au textarea via un listener (focusgained) sur le rootpane, mais en plus de compliquer la gestion du focus s'il y a d'autres composants dans la frame, les touches du clavier ne fonctionnent plus pour le menu. Il faut donc resimuler tout ça (de façon similaire à la jlist).

    Je ne comprends pas trop pourquoi tu as besoin à la fois d'un popupmenu et de la jlist pour la complétion ?

    Sinon pour le consume, c'est en effet sur le keyPressed et pas le keyTyped qu'il faut brûler l'évènement.
    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
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Le composant StandaloneTextArea de jedit pourraitpeut-etre te servir. Il gère déjà la coloration syntaxique liée à un language, il y a des plugins pour l'autocompletion.
    http://jedit.org/api/org/gjt/sp/jedi...eTextArea.html

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Bonjour, désole de répondre si tardivement j'ai suivi vos conseils en particulier celui de joel que je remercie comme vous tous et voilà le code qui fait que ceci marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    		if(e.getKeyCode()==KeyEvent.VK_DOWN && T105.pop.isVisible()){	
    		    e.consume();
    		    comptFleche=true;
    		    int selectionIndex = T105.liste.getSelectedIndex();
    		    if (selectionIndex<T105.liste.getModel().getSize()) {
    			T105.liste.setSelectedIndex(selectionIndex+1);
    			return;
    		    }
    		}
    Il manquait juste le
    et maintenant ceci marche presque à la perfection, il ne me reste quelques détails à fignoler. Je pense que je peux mettre le sujet en Résolu et merci encore !

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

Discussions similaires

  1. problème focus comosant jDesktopPane
    Par debutJava dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 31/07/2006, 09h27
  2. Problème de java.lang.NoClassDefFoundError
    Par nramariavelo dans le forum Hibernate
    Réponses: 5
    Dernier message: 13/06/2006, 14h54
  3. problème sous java
    Par lazzeroni dans le forum Oracle
    Réponses: 4
    Dernier message: 12/04/2006, 15h16
  4. Problème Applet Java et Win XP SP2
    Par octal dans le forum Applets
    Réponses: 4
    Dernier message: 04/02/2006, 09h57
  5. divers problème avec Java et jdbc
    Par chti_juanito dans le forum JDBC
    Réponses: 28
    Dernier message: 31/10/2005, 16h54

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