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 :

[MAJ]Problème de propagation d'évènement + Key Binding


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut [MAJ]Problème de propagation d'évènement + Key Binding
    Salut tout le monde!

    J'ai implémenté le Key Binding en me basant sur le tuto Sun, mais je l'ai fait à la bourrin on va dire

    Ce que j'aimerai c'est avoir votre avis sur la meilleure méthodologie à appliquer pour généraliser au maximum l'utilisation de ce procédé.

    Je m'explique...
    En fait, j'aimerai pouvoir créer des IHM utilisant le Key Binding, chacune à sa sauce, mais sans avoir à redéfinir tout le mécanisme à chaque fois.
    Pour l'instant, je me suis créer ce genre de classe :
    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
     
    public abstract class MyDialog extends JDialog {
     
    	public MyDialog(Dialog arg0, boolean arg1) throws HeadlessException {
    		super(arg0, arg1);
            initKeyManagement();
    	}
     
    	public MyDialog(Dialog arg0, String arg1, boolean arg2, GraphicsConfiguration arg3) throws HeadlessException {
    		super(arg0, arg1, arg2, arg3);
    		initKeyManagement();
    	}
     
    	public MyDialog(Dialog arg0, String arg1, boolean arg2) throws HeadlessException {
    		super(arg0, arg1, arg2);
    		initKeyManagement();
    	}
     
    	public MyDialog(Dialog arg0, String arg1) throws HeadlessException {
    		super(arg0, arg1);
    		initKeyManagement();
    	}
     
    	public MyDialog(Dialog arg0) throws HeadlessException {
    		super(arg0);
    		initKeyManagement();
    	}
     
    	public MyDialog(Frame arg0, boolean arg1) throws HeadlessException {
    		super(arg0, arg1);
    		initKeyManagement();
    	}
     
    	public MyDialog(Frame arg0, String arg1, boolean arg2, GraphicsConfiguration arg3) {
    		super(arg0, arg1, arg2, arg3);
    		initKeyManagement();
    	}
     
    	public MyDialog(Frame arg0, String arg1, boolean arg2) throws HeadlessException {
    		super(arg0, arg1, arg2);
    		initKeyManagement();
    	}
     
    	public MyDialog(Frame arg0, String arg1) throws HeadlessException {
    		super(arg0, arg1);
    		initKeyManagement();
    	}
     
    	public MyDialog(Frame arg0) throws HeadlessException {
    		super(arg0);
    		initKeyManagement();
    	}
     
    	public MyDialog(){
    		super();
    		initKeyManagement();
    	}
     
     
     
     
    	protected void initKeyManagement() {
    		Object escapeCommand = new Object();
    		// Object enterCommand = new Object();
    		KeyStroke ksEscape = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0);
    		// KeyStroke ksEnter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
    		InputMap im = getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
    		InputMap im2 = getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
    		InputMap im3 = getRootPane().getInputMap(JComponent.WHEN_FOCUSED);
    		ActionMap am = getRootPane().getActionMap();
     
    		im.put(ksEscape, escapeCommand);
    		im2.put(ksEscape, escapeCommand);
    		im3.put(ksEscape, escapeCommand);
    		// im.put(ksEnter, enterCommand);
     
    		if (am == null)
    			am = new ActionMap();
     
    		am.put(escapeCommand, new MyKeyAction(ksEscape.getKeyCode()));
    		// am.put(enterCommand, new MyKeyAction(ksEnter.getKeyCode()));
    	}
     
    	protected abstract void escapeActionPerformed();
     
     
     
     
     
    	class MyKeyAction extends AbstractAction {
    		protected int keyCode;
     
     
    		public MyKeyAction(int keyCode) {
    			this.keyCode = keyCode;
    		}
     
    		public void actionPerformed(ActionEvent arg0) {
    			switch (keyCode) {
    			case KeyEvent.VK_ESCAPE :
    //				bCancel.doClick();
    				escapeActionPerformed();
    				break;
     
    //			case KeyEvent.VK_ENTER :
    //				enterActionPerformed();
    //				break;
     
    			default :
    				break;
    			}
    		}
    	}
    }
    Ensuite, chacune de mes JDialog étend cette classe et redéfinit la méthode abstraite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    escapeActionPerformed()
    de manière à réaliser le traitement adéquat (ça ferme la JDialog, mais il y a parfois d'autres traitements à réaliser).

    Le "problème", c'est que certaines IHM doivent répondre à d'autres touches (par exemple la touche "Entrée"), et certaines IHM peuvent avoir des comportements différents sur la pression de ces touches suivant le composant ayant le focus (par exemple, sur une JDialog contenant un champs texte, la pression de la touche "Entrée" doit soit valider la saisie du champs texte si ce dernier a le focus, soit valider toute la JDialog [clic sur bouton OK] si c'est un autre composant qui a le focus).

    Ce que j'aimerai c'est trouver un mécanisme assez général me permettant de gérer tout ceci, sans tout redéfinir à chaque fois.
    Par exemple, j'ai l'impression que la classe MyKeyAction que j'ai créée n'est peut-être pas la meilleure solution et qu'il vaudrait mieux créer une nouvelle AbstractAction à chque fois. Mais j'aimerai votre avis.

  2. #2
    Membre éprouvé
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Par défaut
    Je ne vois pas vraiment comment t'aider, mais apparement tu n'as pas envi de créer une nouvelle classe pour chaque cas different, je pense donc qu'une interface serai peut etre adapté ?
    Genre une interface KeyBindingable (pas d'autre idée pour le nom ) avec une méthode getActionFor(KeyStroke stroke) et getKeyStrokeFor(Action a) que tu implementerai différement à chaque fois...
    P.S : c'était juste une idée irréfléchi, une idée balancée en l'air quoi

  3. #3
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Au fait, comment faire pour qu'un évènement soit transmis aux couches supérieures?
    Je m'explique :
    - j'ai une JDialog dans laquelle j'ai implémenté le Key Binding notamment pour la touche "Esc"
    - dans cette JDialog, j'ai une JTable à laquelle j'ai associé un KeyListener qui désélectionne la ligne sélectionnée sur l'appui de la touche "Esc".
    - j'aimerai que s'il n'y a pas de ligne sélectionnée dans la JTable, on propage le KeyEvent à la JDialog pour que celle-ci applique l'action associée dans le Key Binding.

    Pour l'instant, j'ai l'impression que l'évènement est consommé par la JTable et qu'il n'arrive donc pas à la JDialog.

    Voilà ce que je fais dans le KeyListener de ma JTable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	private void table_keyPressed(KeyEvent arg0){
    		if (arg0.getKeyChar() == KeyEvent.VK_ESCAPE) {
    			table.clearSelection();
    		}
    		else if (arg0.getKeyChar() == KeyEvent.VK_DELETE){
    			removeRow();
    		}
    	}
    Cette JTable est dans un JPanel appartenant à la JDialog dont le mécanisme de Key Binding est décrit dans mon premier post.

  4. #4
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut [MAJ]Propagation d'évènement...
    Petit up
    Personne pour mon problème de propagation d'évènement?...

Discussions similaires

  1. Problème de gestion d'évènement
    Par florent_de_brest dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 06/07/2006, 16h48
  2. [VB.NET 2005]Problème de déclenchement d'évènements
    Par LTourist dans le forum Windows Forms
    Réponses: 4
    Dernier message: 04/07/2006, 16h39
  3. [Maj pb] Propagation d'évènement au niveau supérieur
    Par seiryujay dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 26/06/2006, 15h05
  4. [C# 2.0] Propagation d'évènement
    Par l0k1 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 18/05/2006, 14h37
  5. Problème de déclenchement d'évènements dans un timer
    Par ArkSquall dans le forum Composants VCL
    Réponses: 18
    Dernier message: 30/04/2006, 21h32

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