/ / zachytenie udalostí myši na FileBrowserComponent v knižnici Juce - c ++, juce

zachytenie udalostí myši na FileBrowserComponent v Juce library - c ++, juce

Nedávno som začal používať Juce library, Na túto otázku zvyčajne uverejňujem otázky súvisiace s Jucefórum, ale bojujem s problémami z mnohých dní a nedostal som stále žiadne odpovede. Takže stackoveflow stojí za vyskúšanie, aj keď sa zdá, že tu nie je veľa používateľov Juce.

Tu je otázka:

Robím nejaké experimenty s komponentmi Juce. Mám nasledujúcu triedu:

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;
}

Účelom tejto triedy je:

  1. uložiť jeden komponent a hierarchia komponentov (dieťa)

  2. zachytiť všetky súvisiace udalosti myši dieťaťu alebo jednému z jeho potomkov

  3. urob niečo
  4. nakoniec poslať MouseEvent na komponent, ktorý bol nasmerovaný na

Túto triedu som vyskúšal s komponentmi jazdcov akodeti, dokonca aj vnorené do iných komponentov .. všetko funguje dobre. Teraz som robil nejaké experimenty s FileBrowserComponent a zdá sa, že nefunguje správne. Napríklad, keď kliknem na tlačidlo, aby som prešiel do horného adresára, nedostane sa (tlačidlo dostane udalosť myši a klikne, ale v stromovom zobrazení sa nič nestane). Výber položiek zo zoznamu tiež nefunguje.

Aký by mohol byť problém? (Urobil som niekoľko experimentov a zdá sa, že metóda buttonClicked v FileBrowserComponent nie je nazvaná, ale neviem prečo) Nejaké návrhy?

Pokúsil som sa tiež zmeniť kód takto:

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);
}
}

Stále to nefunguje. Každopádne som zistil, že ak komentujem druhé volanie setInterceptMouseClicks (kde zakážem kliknutie myši po), veci budú fungovať (aj keď to nie je výsledok, ktorý by som chcel získať, pretože musím na tomto mieste opakovane použiť udalosti myši) zložka).

Tieto skutočnosti ma môžu viesť k dvom úvahám:

  1. Komponent musí zachytiť myš kliknutia, aj keď sú udalosti myši ručne prešiel do svojho mouseDown metóda (je to pravda? Ja nie som o tom určite)
  2. Po spracovaní udalosti myšiv FileBrowserComponent sú ďalšie triedy, ktoré používajú informácie jej stav zachytenia myši, inak by to fungovalo, keby po target-> mouseDown (newEvent), Ill zakážte kliknutia myši znova. akýkoľvek nápad?

Vopred ďakujem

odpovede:

0 pre odpoveď č. 1

Mali by ste lepšie vytvárať odvodené triedy zKomponent av týchto odvodených triedach implementuje požadované udalosti myši a keď sa tieto udalosti spustia, môžete poslať správu do nadradenej triedy, takže môže robiť ďalšie veci.


0 pre odpoveď č. 2

Zdá sa, že klikáte na dieťasúčasť FileBrowserComponent. a myšová udalosť dieťaťa sa neposiela späť späť k rodičovi (FileBrowserComponent). to je dôvod, prečo, keď kliknete dovnútra, rodič nedostane udalosť.

takže namiesto toho, aby ste šli hore -> zdola, mali by ste ísť zdola -> hore. Ak to chcete urobiť, mali by ste pridať podriadený myš k dieťaťu touto metódou:

addMouseListener (MouseListener *newListener,
bool wantsEventsForAllNestedChildComponents)

Napríklad pre príklad sa vám zobrazuje:

child->addMouseListener(this, true);

Metóda mouseDown () by mala byť takáto:

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
}
}

Dúfam, že vám to pomôže.