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 de MouseListener multiples


Sujet :

AWT/Swing Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juin 2005
    Messages : 175
    Par défaut Problème de MouseListener multiples
    boujour, voici mon probleme du jour :

    j'ai une classe DisplayPanel qui etend Jpanel qui contient des "Part" ,extensions de Components.

    Part et DisplayPanel implémentent MouseListener. je fais une action differente pour le mouseClicked() du DisplayPanel et une autre pour celui de l'extension de Component.

    Cela marche sauf si je rajoute les lignes suivantes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (c.isSelected()) {
                    getFrameMainProjetDesign().getPanelComponentParameters().MAJ(c);
                }
    dans la methode paint() du DisplayPanel.


    dans ce cas, je n'ai plus acces au "click" sur le component, mais le prog considère que j'ai cliqué sur le DisplayPanel (ce qui n'est pas faux non plus) et non pas sur le component.

    pour l'insnat, la methode MAJ(), se contente de mettre a jour un JPanel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void MAJ(Part c) { // TODO : a complete panel...
            variableLabel.setText("ID:"+c.getId()+" selected");
            validate();
        }
    La question est la suivante : pourquoi donc cette action sur un panel externe perturbe l'ecoute de mon DisplayPanel?

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 390
    Par défaut
    On a pas beaucoup de détails pour pouvoir t aider.

    Donne peut etre la declaration des MouseListener.

  3. #3
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juin 2005
    Messages : 175
    Par défaut
    le pb c'est que tout ca est noyé dans un projet deja imposant. mais voici

    - le mouseListener du PanelDisplay :
    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
    public void mouseClicked(MouseEvent e) {
            System.out.println("mouse clicked");
            Part c = getFrameMainProjetDesign().getSelectedPartToAdd();
            if (c!=null) {
                // displaying of the component's image, at the place where the user has clicked
                // we add the component in the project Set, and we give it a the position
                // so we must redefine this component !
                System.out.println("adding of the component with ID "+c.getId());
                Part dimensionsAndSetOKComponent = new Part(c,c.getDefaultHeight(), c.getDefaultWidth(),
                        new Integer(e.getY()), new Integer(e.getX()),
                        getFrameMainProjetDesign().getProjectPartSet());
                getFrameMainProjetDesign().getProjectPartSet().addPart(dimensionsAndSetOKComponent);
                // we unselect the other components of the set and select the newly created
     
                getFrameMainProjetDesign().getProjectPartSet().setAllUnselected();
                getFrameMainProjetDesign().getProjectPartSet().
                	getPartById(dimensionsAndSetOKComponent.getId()).setSelected(true);
                repaint();            
            }
            else {
                System.out.println("no component to add has been selected");
            }
    - le mouseListener de Part (extends Component) :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public void mouseClicked(MouseEvent e) {
            System.out.println("Mouse clicked on Part with ID: "+getId());
            //we cannot select more than one component at the same time :
            getPartSet().setAllUnselected();
            setSelected(true);
            getParent().repaint();
     
     
     
     
        }
    le paint du displayPanel :

    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
    public void paint(Graphics g) {
            //      removing what has previously been displayed
            //g.setColor(this.getBackground());
            g.setColor(Color.WHITE);
            g.fillRect(0,0,getWidth(),getHeight());        
     
            //		we display all the components of the projectPartSet in the PanelProjectDisplay
            Iterator componentsIterator = getFrameMainProjetDesign().getProjectPartSet().iterator();
            while(componentsIterator.hasNext()){
                Part c = (Part)(componentsIterator.next());
                //          we update the information panel if the component is "selected"
                // warning: this following line will cause problem, if we ever
                // decide to allow multiple selection of Parts.
    //          TODO : a remettre en ayant trouvé le bug.. LE PROBLEME EST ICI
                if (c.isSelected()) {
                    //getFrameMainProjetDesign().getPanelComponentParameters().MAJ(c);
                }
                // we repaint the component :            
                System.out.println("component to paint has ID : "+c.getId());
                add(c); // We add the "Component" c to the "Container" PanelProjectDisplay
                c.update(g); // We paint this Part, in the same graphical context
     
     
     
            } 
        }
    et meme le paint de Part :

    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
    /**
         * Paints the component in the specified graphic context
         * (draws the image, at thhe position and with the size definined in this component properties)
         */
        public void paint(Graphics g) {
            if (getImage()!=null) { // a security, BUT a Part is supposed to own an image!
                System.out.println("Ok for painting component ID "+getId()+" coords: "+getPosWidth()+":"+
                        getPosHeight());
                g.drawImage(getImage(),getPosWidth().intValue(),getPosHeight().intValue(),
                        getDefaultWidth().intValue(),getDefaultHeight().intValue(), this); 
                // position 0,0 and "this" is the imageObserver (component)
                // if "selected", we add a red rectangle around the image
                if (isSelected()) {
                    g.setColor(Color.RED);
                    g.drawRect(getPosWidth().intValue(),getPosHeight().intValue(),
                            getDefaultWidth().intValue(),getDefaultHeight().intValue());
                    g.setColor(Color.BLACK);
                }           
            }
        }
    voila, c surement pas simple a comprendre sorti de son contexte.[/b]

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 390
    Par défaut
    Je ne sais pas si c ca, mais pqoi faire un add(Component) dans une méthode paint.
    Je ne suis pas sur de moi, mais ca ne risque pas de l'ajouter en boucle comme paint est une méthode appelé relativement souvent (à moins que ce soit ce que tu veux)?
    Essai d'ajouter un remove(c) avant.
    Sinon effectivement c pas évident de tout saisir.

  5. #5
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juin 2005
    Messages : 175
    Par défaut
    ben si je suis obligé de l'adder pour qu'il soit cliquable par la suite (....et ouvrir le JPoppuMenu, et afficher ces fameuses infos dans ce fameux panel annexe)

    par contre, effectivement je me demande si je suis pas en train de rajouter inutilement autant de composants que de Part au JPanel a chaque repaint()...

    Je viens donc de faire le "add", simplement a l'ajout du composant (dans le mouseClicked() du displaypanel.

    Malheureusement, ca ne résout pas le probleme initial ....

  6. #6
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juin 2005
    Messages : 175
    Par défaut
    en fait le probleme est plus grave (mais peut etre que ca va simplifier la reponse).
    Si je resize la fenetre principale a la souris (ou avec l'icone agrandir), je perds aussi la possibilité de sélectionner les composants entrés dans la taille précédente.
    NB; un deplacement de la fenetre principale n,e pose pas de probleme

    il doit y avoir un truc évident qui m'échappe. Il n'y aurait pas une histoire de priorité pour les selections ou un truc du genre?

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 390
    Par défaut
    Dans ce cas , ca doit forcement venir de tes methodes paint. Car un redimensionnement de fenetre declenche ces méthodes, mais pas un dépla cement de fenêtre.

    Maintenant reste plus qu'a trouver l'erreur.

  8. #8
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juin 2005
    Messages : 175
    Par défaut
    Hypothese sans fondement : si ca se trouve, pour etre selectionnables les composants doivent se trouver dans le dernier panel repainté. mon panel display n'etant qu'un des composants de la frame principale, si ca se trouve ce n'est pas le cas.

    plausible?

  9. #9
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    non, rien à voir : "paint" c'est le V de MVC, et "sélectionnable", c'est le C.

  10. #10
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juin 2005
    Messages : 175
    Par défaut
    tout a fait, bien vu !

    ce n'est pas parce que un composant va peindre (une image dans mon cas) sur une certaine surface d'un panel que ce composnat se trouve a ce dit endroit au niveau de sa "selectionnabilité". Etant donnné que mon appli oblige d'etre capable d'interchanger l'ordre des composants a chaque paint, il faut a chaque fois redefinir les vrais bords de chaque composant tout simplement avec la methode setBounds

    voici le 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
    // THE method paint
     
        public void paint(Graphics g) {
            //      removing what has previously been displayed
            //g.setColor(this.getBackground());
            g.setColor(Color.WHITE);
            g.fillRect(0,0,getWidth(),getHeight());        
     
            //		we display all the components of the projectPartSet in the PanelProjectDisplay
            //		we add in the REVERSE order for a "selection of components" question. do not change this.
            Vector theVector = getFrameMainProjetDesign().getProjectPartSet();    
            removeAll();
            for (int i = 0; i<theVector.size(); i++) {
                Part pToPaint = (Part)(theVector.get(i));
                Part pToAdd = (Part)(theVector.get(theVector.size()-1-i));
              // we update the information panel if the component is "selected"
              // warning: this following line will cause problem, if we ever
              // decide to allow multiple selection of Parts.
              if (pToPaint.isSelected()) {
                  getFrameMainProjetDesign().getPanelComponentParameters().MAJ(pToPaint);
              }
     
              // we repaint the component :              
              pToPaint.update(g); // We paint this Part, in the same graphical context
              // we add the other component
              add(pToAdd);
              pToAdd.setBounds(pToAdd.getPosWidth().intValue(),pToAdd.getPosHeight().intValue(),
                      pToAdd.getDefaultWidth().intValue(),pToAdd.getDefaultHeight().intValue());
              System.out.println("ID : "+pToAdd.getId()+" pos & size : "+pToAdd.getPosWidth().intValue()+" "+pToAdd.getPosHeight().intValue()+" "+
                      pToAdd.getDefaultWidth().intValue()+" "+pToAdd.getDefaultHeight().intValue());
            } 
        }
    merci a tous de votre aide

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

Discussions similaires

  1. [Excel] Problème d'impression multiple et de form
    Par Istrella dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 05/01/2006, 15h28
  2. Problème d'inclusions multiples
    Par Le Furet dans le forum C
    Réponses: 2
    Dernier message: 03/10/2005, 23h59
  3. Réponses: 22
    Dernier message: 05/07/2005, 00h04
  4. Problème d'ajout multiples dans un BDD Access
    Par arnaud_verlaine dans le forum Langage SQL
    Réponses: 3
    Dernier message: 31/05/2004, 13h34
  5. Réponses: 6
    Dernier message: 25/03/2002, 21h11

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