Я останнім часом починаю користуватися Бібліотека соку. Я зазвичай розміщую питання, пов'язані з ДжусомФорум, але я бореться з питаннями вже багато днів, і я не отримав відповіді досі. Тож stackoveflow варто спробувати, навіть якщо здається, що тут не так багато користувачів 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;
}
Цілями цього класу є:
зберігати єдиний компонент ієрархія компонентів (дочірня)
перехопити всі пов'язані з подіями миші дитині або одному з її нащадків
- робити щось
- врешті-решт переслати MouseEvent до компонент, на який він був спрямований до
Я спробував цей клас із компонентами слайдерів якдіти, навіть вкладені всередину інших компонентів .. все працює чудово. Зараз я робив кілька експериментів з FileBrowserComponent і, здається, не працює належним чином. Наприклад, коли я натискаю кнопку, щоб перейти до перевернутого каталогу, це не відбувається (кнопка отримує подію миші, і її клацають, але нічого не відбувається у вигляді дерева). Також вибір елементів зі списку не працює.
У чому може бути проблема? (Я зробив декілька експериментів і, здається, що кнопка методу натиснута у 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 (де я відключаю натискання миші після), змусить це працювати (навіть якщо це не результат, який я хотів би отримати, тому що мені потрібно повторно змінити події миші на цьому компонент).
Ці факти можуть привести мене до двох міркувань:
- Компонент потрібно перехопити мишкою клацання, навіть якщо події миші вручну передається до своєї миші метод (це правда? Я "не такий впевнений у цьому)
- Після обробки події мишів FileBrowserComponent є й інші класи, в яких використовується інформація про його статус перехоплення миші, інакше це буде працювати, якщо після target-> mouseDown (newEvent), я "буду" знову відключити клацання миші. Будь-який ідея?
Спасибі заздалегідь
Відповіді:
0 для відповіді № 1Вам слід краще створити похідні класи зКомпонент і в цих похідних класах реалізують необхідні події миші, і коли ці події запускаються, ви можете опублікувати повідомлення в батьківському класі, щоб він міг робити інші речі.
0 для відповіді № 2
Здається, ти натискаєш на дитинукомпонент 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
}
}
Сподіваюсь, ця допомога.