перехват событий мыши в FileBrowserComponent в библиотеке Juce

Недавно я начал использовать библиотеку Juce. Обычно я публикую вопросы, связанные с Juce, на его форуме, но я много дней борюсь с проблемами и до сих пор не получил ответов. Так что stackoveflow стоит попробовать, даже если кажется, что здесь не так много пользователей Juce.

Вот вопрос:

Я провожу эксперименты с компонентами Juce. У меня есть следующий класс:

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

Целями этого класса являются:

  1. хранить один компонент иерархии компонентов (дочерний)

  2. перехватывать все события мыши, связанные с дочерним элементом или одним из его потомков

  3. сделай что-нибудь
  4. в конечном итоге перенаправить MouseEvent на компонент, на который он был направлен

Я попробовал этот класс с компонентами ползунков в качестве дочерних элементов, даже вложенных в другие компоненты. Все работает нормально. Теперь я проводил некоторые эксперименты с FileBrowserComponent, и, похоже, он не работает должным образом. Например, когда я нажимаю кнопку для перехода в верхний каталог, этого не происходит (кнопка получает событие мыши и нажимается, но в древовидном представлении ничего не происходит). Также не работает выбор элементов из списка.

В чем может быть проблема? (Я провел несколько экспериментов и кажется, что метод buttonClicked в FileBrowserComponent не вызывается, но я не знаю, почему) Любое предложение?

Я также попытался изменить код следующим образом:

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

Это все еще не работает. Во всяком случае, я обнаружил, что если я прокомментирую второй вызов setInterceptMouseClicks (где я отключу щелчок мышью после), все заработает (даже если это не тот результат, который я хотел бы получить, потому что мне нужно повторно отключить события мыши на этом составная часть).

Эти факты могут привести меня к двум соображениям:

  1. Компонент должен перехватывать щелчки мышью, даже если события мыши вручную передаются его методу mouseDown (правда ли это? Я не уверен в этом)
  2. После обработки события мыши в FileBrowserComponent есть другие классы, которые используют информацию о статусе перехвата щелчка мыши, иначе это сработает, если после target->mouseDown(newEvent) я снова отключу щелчки мыши. Есть идеи?

заранее спасибо


person Heisenbug    schedule 11.05.2011    source источник
comment
Я столкнулся с той же проблемой. Вам удалось ее решить?   -  person Dinaiz    schedule 27.06.2011
comment
нет..у меня все еще не было ответа и решения..   -  person Heisenbug    schedule 27.06.2011


Ответы (2)


Вам лучше создавать производные классы от Component, и в этих производных классах реализовывать необходимые события мыши, и когда эти события запускаются, вы можете отправить сообщение родительскому классу, чтобы он мог делать другие вещи.

person Carlos Barbosa    schedule 23.10.2013

Кажется, что вы нажимаете на дочерний компонент FileBrowserComponent. и событие мыши дочернего элемента не пересылается обратно родительскому (FileBrowserComponent). поэтому, когда вы щелкаете внутри, родитель не получит событие.

поэтому вместо того, чтобы идти сверху --> снизу, вы должны идти снизу --> сверху. Для этого: вы должны добавить слушателя мыши к ребенку следующим методом:

addMouseListener (MouseListener *newListener, 
                  bool wantsEventsForAllNestedChildComponents)

Итак, для примера, который вы показываете:

child->addMouseListener(this, true);

И метод mouseDown() должен быть таким:

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

Надеюсь, это поможет.

person Ali Diouri    schedule 10.03.2015