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 evenement touche clavier + souris


Sujet :

AWT/Swing Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 35
    Points : 16
    Points
    16
    Par défaut Problème evenement touche clavier + souris
    Je suis en train de programmer un petit logiciel et je bloque sur certain point.

    Mon logiciel sera un logiciel de dessin, je fais du drag and drop d'élèments et j'aimerai pouvoir les supprimmer avec la touche Suppr mais je n'arrive pas à créer la méthode.

    Sauriez vous comment je pourrais gerer les évenements du clique de la souris et du clavier. j'aimerai que en cliquant une fois sur une image on puisse la selectionné puis en tapant sur la touche suppr(keyEvent.VK_DELETE) quelle se supprime.
    Pouvez vous m'aider à résoudre mon problème.


    voilà mon code:

    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
     
    import java.awt.BorderLayout;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseMotionListener;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import java.awt.FlowLayout;
    import java.awt.event.MouseAdapter;
     
    import javax.swing.JMenuItem;
    import javax.swing.JPopupMenu;
     
    public class Test2 extends JFrame implements MouseMotionListener{
    JLabel[] label = new JLabel[100]; //Copies de l'image
    JPanel p ;//notre panel principal qui contient les images
    int nbCopie=0; //nombre de copies existantes
     
    public Test2(){//constructeur qui créé la fenetre principale
    super("drag and drop");
    p = new JPanel(null);
    createCopy(); //on ajoute une copie au panel
    this.getContentPane().add(p);
    this.setSize(800,600);
    this.setVisible(true);
    }
     
    public static void main(String[] args) {
    new Test2();
    }
     
     
    public void createCopy(){// créé une nouvelle copie de l'image
    label[nbCopie]=new JLabel(new ImageIcon("logo.png"));
    //initialise l'image
    label[nbCopie].setBounds(0,0,120,160); // initialise sa position aux coordonnéees 0,0
    label[nbCopie].addMouseMotionListener(this);//ajoute un mousemotionlistener pour détecter le drag n drop
    p.add(label[nbCopie]);//on ajoute la copie au panel
    p.repaint();//on redessine le pa nel
    nbCopie++; //incrémente le nombre de copies existantes
     
    label[nbCopie]=new JLabel(new ImageIcon("image.gif"));
    //initialise l'image
    label[nbCopie].setBounds(60,0,120,160); // initialise sa position aux coordonnéees 0,0
    label[nbCopie].addMouseMotionListener(this);//ajoute un mousemotionlistener pour détecter le drag n drop
    p.add(label[nbCopie]);//on ajoute la copie au panel
    p.repaint();//on redessine le panel
    nbCopie++; //incrémente le nombre de copies existantes
    }
     
    private JTextField champDeTexte;
     
    void DialogueEtiquette(String titre) {
     
     
        JButton bouton = new JButton("OK");
        bouton.addActionListener((ActionListener) this);
     
        champDeTexte = new JTextField(20);
        champDeTexte.addActionListener((ActionListener) this);
     
        JPanel panneau = new JPanel();
        panneau.add(bouton);
     
        getContentPane().add(new JLabel("Donnez l'étiquette"), BorderLayout.NORTH);
        getContentPane().add(champDeTexte, BorderLayout.CENTER);
        getContentPane().add(panneau, BorderLayout.SOUTH);
        pack();
        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit()
    .getScreenSize();
     
        setLocation((screenSize.width-getSize().width)/2,(screenSize.height-getSize().height)/2);
        setVisible(true);
    }
     
     
    public void keyPressed(KeyEvent event)
    {
    int keyCode = event.getKeyCode();
    if (keyCode == keyEvent.VK_DELETE)
    {
     
    }
    }
     
    public void mouseDragged(MouseEvent e) {
    //lorsque qu'on fais du drag n drop sur une copie
     
    //si la derniere copie créé a été bougée (coordonnées 0,0),
    //on en créé une nouvelle qui sert de modele
    if (label[nbCopie-1].getX() != 0 && label[nbCopie-1].getY()!=0) createCopy();
     
    JLabel temp=(JLabel)e.getSource();
    //créé une référence vers la copie sur laquelle on a cliqué
     
    temp.setBounds(temp.getX()+e.getX()-60,temp.getY()+e.getY()-80,120,160);
    //déplace la copie sur laquelle je fais du drag n drop
    }
     
     
     
    public void mouseMoved(MouseEvent e) {
     
     
     
    try {}
    catch(Exception err) {
    System.out.println("Erreur" + err);};
    }}

  2. #2
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Je n'ai pas tops regarder ton code mais je dirait que la façon la plus simple est simplement d'ajouter un mouselistener à ton mage(en supposant que c'est un objet swing/awt), et lorsque tu reçoit le message mouserealise tu stock le numéro de l'image dans ton tableau(cela suppose que l'image connais sa position).Lors de l'appui sur suppr, tu supprime l'élément portant ce numéro. Sauf que ton tableau a une taille limiter.

    Autre solution : Tu utilise un vecteur/une liste. Ton image contiens un lien vers le tableau. Ton image écoute le clavier/la sélection lui donne le focus(si je ne me trompe pas l'événement clavier est envoiler au composant qui a le focus non? Faudrait voir comment marge l'envoi des évènements clavier...) puis l'objet se "supprime" lui même du tableau(changement de la référence par null, le gorbage collector se chargera de la destruction de l'objet)

    Enfin personnellement j'utiliserai un vecteur et je reconnaîtrait les objets avec leur référence, ce qui a l'avantage de ne pas nécessiter d'associer un numéro à chaque objet (et au passage d'avoir toujours une référence sous la main)

    Donc pour résumer tu peut utiliser le listener de la souris pour les click et le listener du clavier pour les touches.

    Maintenant, je suis pas une référence en java donc je peut pas vraiment t'en dire plus :/

  3. #3
    Membre actif Avatar de jibbi
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 165
    Points : 205
    Points
    205
    Par défaut
    Salut

    Pour répondre à ta question:
    j'aimerai que en cliquant une fois sur une image on puisse la selectionné puis en tapant sur la touche suppr(keyEvent.VK_DELETE) quelle se supprime.
    Pour utiliser la méthode keyPressed() il faut implementer l'interface KeyListener ou la class KeyAdapter. Ta classe impléments seulement MouseMotionListener. Et implémenter MouseListener ou utiliser la classe MouseAdapter pour les évenement click, pressed ... de la souris.

    Donc pour la souris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //...
    JLabel selected = null; // déclarer en variable globale
    //...
     
    public void mousePressed(MouseEvent e){
    if (e.getSource() instanceof JLabel)
    selected = (JLabel) e.getSource();
    selected.setBorder(BorderFactory.createLineBorder(Color.blue, 2));// effet de sélection
    }
    le contenu la méthode keyPressed():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //...
    public void keyPressed(KeyEvent event){
    if (event == keyEvent.VK_DELETE){
    if (selected != null){
    // p.remove(selected);
    // ne pas oublier d'enlever la référence dans le tableau
    // ne pas oublier d'enlever la référence dans le tableau
    // ne pas oublier d'enlever la référence dans le tableau
    // sans quoi, le garbage collector ne pourra pas libérer les ressources.
    }
    }
    Il serait plus approprié ( et plus conviviale) d'utiliser un ArrayList au lieu d'un tableau. D'ailleurs, je ne vois pas trop l'intérêt de tenir une liste de références de ces Labels.


    Bon maintenant voyons le coté conception.
    Mon logiciel sera un logiciel de dessin
    En utilisant des composants comme les JLabel, ce n'est pas la meilleure facon d'y arriver. Dessine plustôt les images sur le Graphics d'un BufferedImage. Puis, dessine le BufferedImage sur un composant comme un JPanel .Voir le Double buffering pour plus de détail à ce sujet.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 35
    Points : 16
    Points
    16
    Par défaut
    Tout d'abord merci pour vos réponses.

    Après avoir essayé d' implementer ma classe et d'intégré votre code, il ne se passe rien. J'aimerai comprendre pourquoi et surtout essayer de résoudre cela.

    J'ai rajouté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    import java.awt.event.KeyEvent;
    import java.awt.event.MouseEvent;
    Puis les deux méthodes mousePressed et keyPressed,

    J'ai enlever le commentaire sur p.remove(selected); afin de l'utiliser.

    Mais quand je compile mon programme je n'ai pas l'effet de selection qui apparait et la touche suppr ne réagit pas.

    Avez vous une idée afin de résoudre ceci.

    Cordialement,


    Voici mon code:

    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
    115
    116
    117
    118
    119
    120
    121
    122
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseMotionListener;
     
    import javax.swing.BorderFactory;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
     
    public class Test2 extends JFrame implements MouseMotionListener{
    JLabel[] label = new JLabel[100]; //Copies de l'image
    JPanel p ;//notre panel principal qui contient les images
    JLabel selected = null;
    int nbCopie=0; //nombre de copies existantes
     
    public Test2(){//constructeur qui créé la fenetre principale
    super("drag and drop");
    p = new JPanel(null);
    createCopy(); //on ajoute une copie au panel
    this.getContentPane().add(p);
    this.setSize(800,600);
    this.setVisible(true);
    }
     
    public static void main(String[] args) {
    new Test2();
    }
     
     
    public void createCopy(){// créé une nouvelle copie de l'image
    label[nbCopie]=new JLabel(new ImageIcon("logo.png"));
    //initialise l'image
    label[nbCopie].setBounds(0,0,120,160); // initialise sa position aux coordonnéees 0,0
    label[nbCopie].addMouseMotionListener(this);//ajoute un mousemotionlistener pour détecter le drag n drop
    p.add(label[nbCopie]);//on ajoute la copie au panel
    p.repaint();//on redessine le pa nel
    nbCopie++; //incrémente le nombre de copies existantes
     
    label[nbCopie]=new JLabel(new ImageIcon("image.gif"));
    //initialise l'image
    label[nbCopie].setBounds(60,0,120,160); // initialise sa position aux coordonnéees 0,0
    label[nbCopie].addMouseMotionListener(this);//ajoute un mousemotionlistener pour détecter le drag n drop
    p.add(label[nbCopie]);//on ajoute la copie au panel
    p.repaint();//on redessine le panel
    nbCopie++; //incrémente le nombre de copies existantes
    }
     
    private JTextField champDeTexte;
     
    void DialogueEtiquette(String titre) {
     
     
        JButton bouton = new JButton("OK");
        bouton.addActionListener((ActionListener) this);
     
        champDeTexte = new JTextField(20);
        champDeTexte.addActionListener((ActionListener) this);
     
        JPanel panneau = new JPanel();
        panneau.add(bouton);
     
        getContentPane().add(new JLabel("Donnez l'étiquette"), BorderLayout.NORTH);
        getContentPane().add(champDeTexte, BorderLayout.CENTER);
        getContentPane().add(panneau, BorderLayout.SOUTH);
        pack();
        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit()
    	.getScreenSize();
     
        setLocation((screenSize.width-getSize().width)/2,(screenSize.height-getSize().height)/2);
        setVisible(true);
    }
     
    public void mousePressed(MouseEvent e){
    	if (e.getSource() instanceof JLabel)
    	selected = (JLabel) e.getSource();
    	selected.setBorder(BorderFactory.createLineBorder(Color.blue, 2));// effet de sélection
    	}
     
    public void keyPressed(KeyEvent event){
    	int keyCode = event.getKeyCode();
    	if (keyCode == event.VK_DELETE){
    	if (selected != null){
    	 p.remove(selected);
    	// ne pas oublier d'enlever la référence dans le tableau
    	// ne pas oublier d'enlever la référence dans le tableau
    	// ne pas oublier d'enlever la référence dans le tableau
    	// sans quoi, le garbage collector ne pourra pas libérer les ressources.
    	}
    	}
    }
     
    public void mouseDragged(MouseEvent e) {
    //lorsque qu'on fais du drag n drop sur une copie
     
    //si la derniere copie créé a été bougée (coordonnées 0,0),
    //on en créé une nouvelle qui sert de modele
    if (label[nbCopie-1].getX() != 0 && label[nbCopie-1].getY()!=0) createCopy();
     
    JLabel temp=(JLabel)e.getSource();
    //créé une référence vers la copie sur laquelle on a cliqué
     
    temp.setBounds(temp.getX()+e.getX()-60,temp.getY()+e.getY()-80,120,160);
    //déplace la copie sur laquelle je fais du drag n drop
    }
     
     
     
    public void mouseMoved(MouseEvent e) {
     
     
     
    try {} 
    	catch(Exception err) {
    				System.out.println("Erreur" + err);};
    }}

  5. #5
    Membre régulier Avatar de kerinel
    Profil pro
    Inscrit en
    Février 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 103
    Points : 107
    Points
    107
    Par défaut
    Bonjour,
    tout d'abord tu dois lever de belles exceptions à l'exécution avec ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bouton.addActionListener((ActionListener) this);
    ton Test2 n'implémentant pas la méthode
    public void actionPerformed (ActionEvent e)
    je suis étonné que tu ne te fasses pas jeter quand tu cliques sur bouton

    pour gérer la réponse au clic tu dois d'une part déclarer que Test2 implémente ActionListener comme il implémente MouseListener et d'autre part remplir le contrat avec l'Interface ActionListener c'est à dire implémenter la méthode
    public void actionPerformed (ActionEvent e)
    du coup tu n'as plus besoin de transtyper :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bouton.addActionListener(this);
    Même chose pour les éléments du clavier: il faut déclarer que Test2 implémente KeyListener. Et il faut signaler que ton composant est intéressé à l'écoute des éléments du clavier. si tu ne fais que mettre la méthode, personne ne sait qu'elle est là donc personne ne l'utilisera
    au final :
    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 class Test2 extends JFrame implements MouseMotionListener, ActionListener, KeyListener {
    ...
    public Test2(){//constructeur qui créé la fenetre principale
    super("drag and drop");
    p = new JPanel(null);
    createCopy(); //on ajoute une copie au panel 
     
    addKeyListener(this);
     
    this.getContentPane().add(p);
    this.setSize(800,600);
    this.setVisible(true);
    }
    Bon code,
    kerinel

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 35
    Points : 16
    Points
    16
    Par défaut
    Ou dois je utiliser ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bouton.addActionListener(this);
    et pour ce qui est des exceptions si j'ai bien compris à la fin de mon code je rajoute ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bouton.addActionListener((ActionListener) this);
    mais il y a un problème de parenthèse justement...

    j'ai bien implementer ma classe avec ActionListener, KeyListener

    mais comment puis je implementer ma méthode actionPerformed; est ce que ceci est correcte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public void actionPerformed(ActionEvent arg0) {
    	AbstractButton bouton = null;
    	bouton.addActionListener(this);
    	// TODO Auto-generated method stub
     
    }
    je pense qu'on va regler le problème petit à petit...merci beaucoup pour votre aide.

  7. #7
    Membre régulier Avatar de kerinel
    Profil pro
    Inscrit en
    Février 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 103
    Points : 107
    Points
    107
    Par défaut
    Salut, je te conseille de faire un tour dans la FAQ pour bien comprendre ce qu'est une interface :
    http://java.developpez.com/faq/java/...TION_interface
    et ce que sont les évènements ainsi que les Listeners :
    http://java.developpez.com/faq/gui/?...wing_listeners

    Pour les méthodes des Listeners il ne suffit pas de les écrire, il faut ensuite enregistrer ton objet comme étant à l'écoute.
    L'objet qui enregistre est un ActionListener est par exemple un bouton, en bref un objet capable de génerer un ActionEvent. Celui pour le MouseMotionListener est le plus souvent un Component (donc ta JFrame dans ton cas car elle hérite de Component) et pour KeyListener c'est aussi un Component (idem).

    tu rajoutes bouton.addActionListener(this); juste apres la crèation de ton bouton. Tu indiques ainsi que ton objet va recevoir tous les ActionEvent créer par ton bouton.

    Tu ne rajoutes nulle part l'horreur juste apres :
    bouton.addActionListener((ActionListener) this);
    si ça passe à la compilation ça ne fonctionnera pas.

    Sinon dans actionPerformed tu ne crées pas le bouton. Tu répond à un clic sur le bouton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public void actionPerformed(ActionEvent e) {
    	//faire ce qu'il faut faire quand on clique
     
    }
    Un conseil, je vois que tu utilise un IDE; désactive la génération automatique de code pour commencer car tu fais rajouter des trucs que tu ne comprendras pas forcément. Au début, il vaut mieux tout faire à la mano pas à pas pour bien comprendre ce qu'on écrit.

    bon code,
    kerinel

Discussions similaires

  1. Problème de touche clavier
    Par patoche.05 dans le forum Langage
    Réponses: 9
    Dernier message: 27/10/2012, 17h05
  2. [Débutant] Evenement Touche clavier "Entrée"
    Par aziatedu13 dans le forum VB.NET
    Réponses: 2
    Dernier message: 04/07/2011, 12h22
  3. Problème TwebBrowser : touches claviers
    Par Invité(e) dans le forum Composants VCL
    Réponses: 7
    Dernier message: 03/07/2011, 08h47
  4. problème code touches clavier
    Par vbapprenti dans le forum Général VBA
    Réponses: 9
    Dernier message: 10/05/2011, 00h30
  5. [C#] Récupération touche clavier & souris
    Par gailup dans le forum C#
    Réponses: 4
    Dernier message: 05/02/2008, 18h12

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