我最近开始使用Juce library。我通常在论坛上发布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;
}
本课程的目的是:
存储a的单个组件 组件层次结构(子)
拦截所有相关的鼠标事件 对孩子或其后代之一
我尝试使用滑块组件作为子类,甚至嵌套在其他组件中这个类..一切正常。 现在我正在使用FileBrowserComponent进行一些实验,似乎无法正常工作。例如,当我单击按钮移动到上部目录时它不会(按钮接收鼠标事件并且单击它但树视图中没有任何内容)。 同样从列表中选择项目也不起作用。
可能是什么问题? (我做了一些实验,似乎没有调用FileBrowserComponent中的方法buttonClicked,但我不知道为什么) 有什么建议吗?
我也尝试过这样修改代码:
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(我禁用鼠标点击之后)使事情有效(即使这不是我想要获得的结果,因为我需要在那上面重新启动鼠标事件组分)。
这些事实可以让我有两个考虑因素:
提前致谢
答案 0 :(得分:0)
您最好从Component创建派生类,并在这些派生类中实现其所需的鼠标事件,并且当这些事件被触发时,您可以将消息发布到父类,因此它可以执行其他操作。
答案 1 :(得分:0)
您似乎正在点击FileBrowserComponent的子组件。并且子节点的鼠标事件不会转发回父节点(FileBrowserComponent)。这就是为什么当您点击内部时,父母将不会收到该事件。
所以不要去Top - >底部,你应该到底 - >最佳。为此:您应该通过以下方法向子项添加鼠标侦听器:
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
}
}
希望得到这个帮助。