2011-05-11 2 views
2

J'ai récemment commencé à utiliser Juce library. Je poste habituellement des questions liées à Juce sur son forum, mais je suis aux prises avec des problèmes de beaucoup de jours, et je n'ai toujours pas reçu de réponse. Donc stackoveflow vaut le coup d'essayer même s'il semble qu'il n'y a pas beaucoup d'utilisateurs de Juce ici.interception d'événements de souris sur FileBrowserComponent dans la bibliothèque Juce

est ici la question:

Je fais quelques expériences avec les composants de Juce. J'ai la classe suivante:

class MyComponent : public Component{ 

public : 
MyComponent(Component * comp){ 
    this->child = comp; 
    comp->setInterceptsMouseClicks(false, false); 

} 
void mouseDown (const MouseEvent &e){ 

    //do stuff 
    Component *target = getTopChild(this->child, e.x, e.y); //return top most component of child that would have intercept the mouse event if that wasn't intercepted by MyComponent class 
    if (target != NULL && doIWantToForwardEventToTarget()){ 
     MouseEvent newEvent = e.getEventRelativeTo(target); 
     target->mouseDown(newEvent); 
    } 
} 
void mouseMove (const MouseEvent &e); 
void mouseEnter (const MouseEvent &e); 
void mouseExit (const MouseEvent &e); 
void mouseDrag (const MouseEvent &e); 
void mouseUp (const MouseEvent &e); 
void mouseDoubleClick (const MouseEvent &e); 
void mouseWheelMove (const MouseEvent &e, float wheelIncrementX, float wheelIncrementY); 

private: 

Component *child; 
} 

Les buts de cette classe sont:

  1. magasin une seule composante d'une hiérarchie des composants (enfant)

  2. intercepter tous les événements de la souris à l'enfant ou l'un de ses descendants

  3. faire
  4. éventuellement avancer le MouseEvent à la composante dont il a été dirigé à

J'ai essayé cette classe avec des composants de curseurs que les enfants, même à l'intérieur d'autres composants imbriqués .. tout fonctionne très bien. Maintenant, je faisais des expériences avec FileBrowserComponent et il ne semble pas fonctionner correctement. Par exemple, lorsque je clique sur le bouton pour passer au répertoire amont, ce n'est pas le cas (le bouton reçoit l'événement souris et il est cliqué mais rien ne se passe dans l'arborescence). La sélection d'éléments dans la liste ne fonctionne pas non plus.

Quel pourrait être le problème? (J'ai fait quelques expériences et semble que la méthode buttonClicked dans le FileBrowserComponent n'est pas appelée, mais je ne sais pas pourquoi) Une suggestion?

J'ai essayé aussi de modifier le code de cette façon:

void mouseDown (const MouseEvent &e){ 

    //do stuff 
    Component *target = getTopChild(this->child, e.x, e.y); //return top most component of child that would have intercept the mouse event if that wasn't intercepted by MyComponent class 
    if (target != NULL && doIWantToForwardEventToTarget()){ 
     target->setInterceptsMouseClicks(true, true); 
     MouseEvent newEvent = e.getEventRelativeTo(target); 
     target->mouseDown(newEvent); 
     target->setInterceptsMouseClicks(false, false); 
    } 
} 

Il ne fonctionne toujours pas. Quoi qu'il en soit, j'ai découvert que si je commente le second appel à setInterceptMouseClicks (où je désactive le clic de la souris), ça marche (même si ce n'est pas le résultat que je voudrais obtenir car je dois redéfinir les évènements de la souris composant).

Ces faits peuvent me conduit à 2 considérations:

  1. Un besoin composant pour intercepter la souris clics, même si les événements de souris sont passés manuellement à sa méthode mouseDown (est-ce vrai que je ne suis pas? sûr que)
  2. Après la gestion des événements de la souris dans FileBrowserComponent il y a d'autres classes qui utilise les informations de son interception statut de clic de souris, sinon fonctionnerait si après le target-> mouseDown (newEvent), je vais de nouveau désactiver les clics de souris. Toute idée ?

Merci à l'avance

+0

Je suis confronté au même problème. Avez-vous réussi à le résoudre? – Dinaiz

+0

non ... Je n'avais toujours pas de réponse et pas de solution .. – Heisenbug

Répondre

0

Vous devriez mieux créer des classes dérivées de composants, et dans les classes dérivées de mettre en œuvre leurs événements de souris nécessaires, et lorsque ces événements sont déclenchés, vous pouvez envoyer un message à la classe parente, donc ça peut faire d'autres choses.

0

Il semble que vous cliquiez sur un composant enfant de FileBrowserComponent. et l'événement souris de l'enfant n'est pas renvoyé au parent (FileBrowserComponent). C'est pourquoi, lorsque vous cliquez à l'intérieur, le parent ne recevra pas l'événement. Donc au lieu d'aller en haut -> en bas, vous devriez aller en bas -> en haut. Pour faire ceci, vous devez ajouter un écouteur de souris à l'enfant par cette méthode:

addMouseListener (MouseListener *newListener, 
        bool wantsEventsForAllNestedChildComponents) 

Pour l'exemple vous montrant:

child->addMouseListener(this, true); 

Et la méthode mouseDown() devrait être comme ça :

void mouseDown (const MouseEvent &e){ 

    if(this->child == e.eventComponent){ 
     // this mouse event is coming from 
     // the child component or child's children 
     // as wantsEventsForAllNestedChildComponents = true 

     // do something 
    } 
} 

Espérons que cette aide.

Questions connexes