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

 Java Discussion :

[Action] comment faire équivalent à un KeyListener avec Action sur un JPanel


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 100
    Par défaut [Action] comment faire équivalent à un KeyListener avec Action sur un JPanel
    J'ai créé mon action BLAction et je déclare un JButton comme ça :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BLbutton.setAction(new BLAction("", new ImageIcon("img//bl1.png"), "Affichage des BL", 113));
    Keycode : 113 = > F1

    Comment je peux dire que quand j'appuie sur F1 ça lance ma BLAction ?
    Sans que le JButton soit avec le focus. ( même avec ça ne marche pas là )

    M'avez vous compris ?

    Je ne souhaite pas utiliser les Keystroke.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2010
    Messages : 54
    Par défaut
    Tu as les inputmap/actionmap, mais ça passe par les keystroke:

    http://java.sun.com/docs/books/tutor...eybinding.html

    Sinon tu peux utiliser les mnemonics, mais alors là tu nécessitera de faire alt- en même temps (ou peut etre "pomme" sous mac os x)

    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
    import java.awt.event.*;
    import javax.swing.*;
     
     
    public class TestFrame extends JFrame{
          public static void main(String args[]) {
            JFrame frame = new JFrame("DefaultButton");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            AbstractAction action = new AbstractAction() {
     
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println("Action");
                }
            };
            action.putValue(Action.MNEMONIC_KEY, KeyEvent.VK_F11);
            action.putValue(Action.NAME, "Test (F2 / CTRL-SHIFT-F7 / ALT-F11)");
            JButton button1 = new JButton(action);
            button1.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_F7,InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK),"monaction");
            button1.getInputMap().put(KeyStroke.getKeyStroke("F2"),"monaction");
            button1.getActionMap().put("monaction",action);
            frame.add(button1);
            frame.setSize(300, 200);
            frame.setVisible(true);
          }
     
    }

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 100
    Par défaut
    en fait mon code fonctionnait avec les mnemonic, et effectivement il faut appuyer sur alt + F1.

    Car en fait j'ai une JFrame qui s'ouvre mais ce n'est pas mon programme principal, si j'utilise des keystrokes ça va s'appliquer à tout le programme non ?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2010
    Messages : 54
    Par défaut
    le code que je t'ai fournis ne fonctionne que si le composant à le focus. Tu peux l'adapter comme ça pour les autres types d'actions (teste tu verras) mais en tous cas, c'est limité à la fenêtre courante:
    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
     
    import java.awt.FlowLayout;
    import java.awt.event.*;
    import java.util.Arrays;
     
    import javax.swing.*;
     
     
    public class TestFrame extends JFrame{
          public static void main(String args[]) {
     
            for (int inputType: Arrays.asList(JComponent.WHEN_FOCUSED,JComponent.WHEN_IN_FOCUSED_WINDOW)){
            JFrame frame = new JFrame("DefaultButton -> case "+inputType);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            AbstractAction action = new AbstractAction() {
     
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println("Action");
                }
            };
            action.putValue(Action.MNEMONIC_KEY, KeyEvent.VK_F11);
            action.putValue(Action.NAME, "Test (F2 / CTRL-SHIFT-F7 / ALT-F11)");
            JButton button1 = new JButton(action);
            button1.getInputMap(inputType).put(KeyStroke.getKeyStroke(KeyEvent.VK_F7,InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK),"monaction");
            button1.getInputMap(inputType).put(KeyStroke.getKeyStroke("F2"),"monaction");
            button1.getActionMap().put("monaction",action);
            frame.setLayout(new FlowLayout());
            frame.add(button1);
            frame.add(new JTextField(25));
            frame.setSize(300, 200);
            frame.setVisible(true);
            }
          }
     
    }

  5. #5
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 100
    Par défaut
    En fait j'ai trouvé sur un autre post quelque chose qui fonctionne très bien.
    Focus indispensable sur la JFrame => ce qui m'intéresse ici.
    Il faut créer action par action, et pas une action globale où l'on différencie par l'ActionEvent evt.getcommand() qui est toujours null.

    Voilà have fun !

    Merci à toi d'avoir répondu quand même

    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
    InputMap inputMap = rootPane
    				.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
     
    		inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "Suivant");
    		inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "Suivant");
    		inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), "Suivant");
     
    		inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "Precedent");
    		inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "Precedent");
     
    		inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "Quitter");
     
    		rootPane.getActionMap().put("Suivant", new AbstractAction("Suivant") {
    			public void actionPerformed(ActionEvent evt) {
    				System.out.println("Suivant");
    				frameViewer.this.showSuivant();
    			}
    		});
    		rootPane.getActionMap().put("Precedent",
    				new AbstractAction("Precedent") {
    					public void actionPerformed(ActionEvent evt) {
    						System.out.println("Precedent");
    						frameViewer.this.showPrecedent();
    					}
    				});
    		rootPane.getActionMap().put("Quitter", new AbstractAction("Quitter") {
    			public void actionPerformed(ActionEvent evt) {
    				System.out.println("Quitter");
    				frameViewer.this.dispose();
    			}
    		});

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 04/08/2011, 21h21
  2. Réponses: 0
    Dernier message: 28/03/2011, 16h24
  3. comment faire un net send avec winpcap?
    Par Zetmurin dans le forum Développement
    Réponses: 2
    Dernier message: 14/06/2005, 07h13
  4. Réponses: 10
    Dernier message: 30/06/2004, 13h00
  5. Je suis un gros boulet ou comment faire de la 2D avec DX
    Par Freakazoid dans le forum DirectX
    Réponses: 4
    Dernier message: 19/06/2004, 15h55

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