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 :

KeyPressed qui ne se déclenche pas


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Julien Bodin
    Homme Profil pro
    Devops
    Inscrit en
    Février 2009
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Février 2009
    Messages : 474
    Par défaut KeyPressed qui ne se déclenche pas
    Bonjour à tous !

    Je suis en train de développer l'interface graphique de mon application et je rencontre une petite difficulté.

    J'utilise une classe perso (LevelPainter) héritant de Component sur lequel je dessine. Lorsqu'un utilisateur clique sur la surface de ce composant un rectangle noir s'affiche correspondant simplement à un "rectangle de sélection".

    J'aimerais que l'utilisateur puisse ensuite intéragir avec le composant avec les touches flechées (pour déplacer le rectangle de selection) et la touche suppr pour effacer ce qui se trouve sous le rectangle de sélection.

    Seulement voilà, même après avoir ajouté un KeyListener à mon LevelPainter les différents évènements associés ne se déclenchent jamais.
    Peut-être parce que cet objet ne gère pas la notion de focus ? je ne sais pas...

    Que dois-je faire pour que mon composant puisse gérer ce type d'évènement ?

    Je vous remercie d'avance pour votre aide !

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Par défaut
    Essaie d'envoyer un bout de code, ce sera plus simple pour essayer de t'aider.

  3. #3
    Membre éclairé Avatar de Julien Bodin
    Homme Profil pro
    Devops
    Inscrit en
    Février 2009
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Février 2009
    Messages : 474
    Par défaut
    J'ai pas mal de lignes de code

    Que veux-tu voir exactement ?

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Citation Envoyé par julien.1486 Voir le message
    J'ai pas mal de lignes de code

    Que veux-tu voir exactement ?
    Donne un petit exemple le plus court possible reproduisant le problème.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  5. #5
    Membre éclairé Avatar de Julien Bodin
    Homme Profil pro
    Devops
    Inscrit en
    Février 2009
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Février 2009
    Messages : 474
    Par défaut
    Hum... Donc :

    Voici ma classe Level Painter :

    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
    public class LevelPainter extends Component{
    		private SubMap sb;
    		private Point selectedBloc;
    		private int x;
    		private int y;
     
     
    		public void paint(Graphics g) {}	
     
    		public void drawGride(Graphics2D g2) {}
     
    		public void drawSelected(Graphics2D g2) {}		
     
    		public Point getBlocCoord(Point px) {}
    	}
    Les méthodes sont implémentées, je n'ai pas copié le code parce qu'il est inutile à la compréhension du problème.

    Concrètement j'ai un JTabbedPane qui va contenir plusieurs onglets (JScrollPane ajoutés dynamiquement).
    Chacun de ces panel contient une instance différente de LevelPainter :

    Voici la méthode qui me renvoit un de ces JScrollPane (en fait c'est une classe qui hérite de JScrollPane et qui me permet d'y stocker quelques données que j'ai besoin de conserver) :

    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
    private JScrollPaneSb getJSCP(final SubMap sb) {
    		final JScrollPaneSb scSbDraw = new JScrollPaneSb(sb, JScrollPane.VERTICAL_SCROLLBAR_NEVER, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    		scSbDraw.setPreferredSize(new Dimension(500, 350));
    		scSbDraw.setBorder(BorderFactory.createTitledBorder("Sub map"));
     
    				final LevelPainter lp = new LevelPainter();
    				lp.sb = sb;
    				scSbDraw.lp = lp;
    				lp.setPreferredSize(sb.getDimension());
    				scSbDraw.setViewportView(lp);
    				lp.repaint();
     
                                    //Les évènements liés au KeyListener() ne se déclenchent pas
    				lp.addKeyListener(new KeyListener() {
     
    					public void keyPressed(KeyEvent e) {
    						System.out.println(e);
     
    					}
     
    					public void keyReleased(KeyEvent e) {
    						System.out.println(e);
     
    					}
     
    					public void keyTyped(KeyEvent e) {
    						System.out.println(e);
     
    					}
     
    				});
     
                                    //Ne se déclenchent pas non plus
    				lp.addFocusListener(new FocusListener() {
     
    					public void focusGained(FocusEvent e) {
    						System.out.println(e);
     
    					}
     
    					public void focusLost(FocusEvent e) {
    						System.out.println(e);
     
    					}
     
    				});
     
    				lp.addMouseMotionListener(new MouseMotionListener() {});
     
    				lp.addMouseListener(new MouseListener() {});
     
     
    		return scSbDraw;
    	}
    Même chose, je n'ai gardé que ce qui me semblait pertinent.

    LevelPainter et JScrollPaneSb sont des classes internes à ma JFrame, je n'ai donc pas implémenté d'accesseurs.

    En prime je joins une capture d'écran pour mieux situer. La surface blanche est un LevelPainter avec avec rectangle de sélection et l'onglet affiché est un JScrollPaneSb.


    J'espère que cela pourra vous être utile

    Edit : Voici le code d'un exemple complet :
    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
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
     
    import javax.swing.SwingUtilities;
    import javax.swing.WindowConstants;
     
    public class TestComponent extends javax.swing.JFrame {
     
    	/**
            * Auto-generated main method to display this JFrame
            */
    	public static void main(String[] args) {
    		SwingUtilities.invokeLater(new Runnable() {
    			public void run() {
    				TestComponent inst = new TestComponent();
    				inst.setLocationRelativeTo(null);
    				inst.setVisible(true);
    			}
    		});
    	}
     
    	public TestComponent() {
    		super();
    		initGUI();
    	}
     
    	private void initGUI() {
    		try {
    			setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    			LevelPainter lp = new LevelPainter();
    			lp.setPreferredSize(new Dimension(400, 300));
    			lp.addKeyListener(new KeyListener() {
     
    				public void keyPressed(KeyEvent e) {
    					System.out.println(e);
     
    				}
     
    				public void keyReleased(KeyEvent e) {
    					System.out.println(e);
     
    				}
     
    				public void keyTyped(KeyEvent e) {
    					System.out.println(e);
     
    				}
     
    			});
    			this.add(lp);
    			pack();
    			setSize(400, 300);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
     
    	public class LevelPainter extends Component{
    		public void paint(Graphics g) {
    			Graphics2D g2 = (Graphics2D) g;
    			g2.setBackground(new Color(255,255,255));
    			g2.fillRect(0, 0, 400, 300);
    		}
    	}
     
    }
    Mais à la limite ça me semble normal que cela ne fonctionne pas vu que d'une certaine manière on ne peut pas donner le focus à ce composant et qu'il ne se sent donc pas concerné par les évènements gérés par le clavier.
    C'est un autre composant de la fenêtre qui les reçoit, ou peut-être qu'aucun composant ne les reçoit tant qu'un composant "focusable" n'est pas défini.
    Images attachées Images attachées  

  6. #6
    Membre émérite Avatar de herch
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    655
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 655
    Par défaut
    salut,

    voici ton exemple modifié, et ça marche.J'ai juste mis le focus sur le LevelPainter créé avec la méthode requestFocusInWindow()
    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
     
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
     
    import javax.swing.SwingUtilities;
    import javax.swing.WindowConstants;
     
    public class TestComponent extends javax.swing.JFrame {
     
    	public static void main(String[] args) {
    		SwingUtilities.invokeLater(new Runnable() {
    			public void run() {
    				TestComponent inst = new TestComponent();
    				inst.setLocationRelativeTo(null);
    				inst.setVisible(true);
    			}
    		});
    	}
     
    	public TestComponent() {
    		super();
    		initGUI();
    	}
     
    	private void initGUI() {
    		try {
    			setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    			LevelPainter lp = new LevelPainter();
    			lp.setPreferredSize(new Dimension(400, 300));
    			lp.addKeyListener(new KeyListener() {
     
    				public void keyPressed(KeyEvent e) {
    					System.out.println(e);					
    				}
     
    				public void keyReleased(KeyEvent e) {
    					System.out.println(e);					
    				}
     
    				public void keyTyped(KeyEvent e) {
    					System.out.println(e);					
    				}
     
    			});
    			this.add(lp);
    			pack();
    			lp.requestFocusInWindow();    //<<<<<<<<<<<<<<
    			setSize(400, 300);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
     
    	public class LevelPainter extends Component{
    		public void paint(Graphics g) {
    			Graphics2D g2 = (Graphics2D) g;
    			g2.setBackground(new Color(255,255,255));
    			g2.fillRect(0, 0, 400, 300);
    		}
    	}
     
    }

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

Discussions similaires

  1. [SWING] Evenement qui ne se déclenche pas
    Par LordBob dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 15/06/2006, 15h57
  2. Evènement qui ne se déclenche pas
    Par max.lille dans le forum Langage
    Réponses: 8
    Dernier message: 09/05/2006, 15h46
  3. onmouseover qui ne se déclenche pas sous IE...
    Par narnou dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 21/03/2006, 17h26
  4. Un JOB qui ne se déclenche pas
    Par blids dans le forum Oracle
    Réponses: 15
    Dernier message: 09/02/2005, 21h14
  5. [trigger] ... qui ne se déclenche pas
    Par bozo dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 14/01/2004, 11h31

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