在getSource()类中没有看到任何PInputEvent方法。
我希望获得对一个对象的引用,该对象被添加到哪个处理程序中。
更新
在下面的示例中,创建了三个同心圆。每一个大的圆圈都有一个小的。鼠标单击处理程序附加到circle2。因为这个循环拥有circle3,所以当单击circle2和circle3而不是circle1时,就会触发处理程序。
如果单击到circle2,如何从处理程序中获取对circle3的引用
这两种测试方法都没有帮助。
package test.piccolo;
import edu.umd.cs.piccolo.event.PBasicInputEventHandler;
import edu.umd.cs.piccolo.event.PInputEvent;
import edu.umd.cs.piccolo.nodes.PPath;
import edu.umd.cs.piccolox.PFrame;
public class App {
@SuppressWarnings("serial")
public static void main(String[] args) {
new PFrame() {
public void initialize() {
PPath circle1 = PPath.createEllipse(-50, -50, 100, 100);
circle1.setPaint(null);
System.out.println("circle1 = " + circle1.toString());
getCanvas().getLayer().addChild(circle1);
PPath circle2 = PPath.createEllipse(-40, -40, 80, 80);
circle2.setPaint(null);
System.out.println("circle2 = " + circle2.toString());
circle1.addChild(circle2);
PPath circle3 = PPath.createEllipse(-30, -30, 60, 60);
circle3.setPaint(null);
System.out.println("circle3 = " + circle3.toString());
circle2.addChild(circle3);
circle2.addInputEventListener(new PBasicInputEventHandler() {
@Override
public void mouseClicked(PInputEvent event) {
Object o;
o = event.getSourceSwingEvent().getSource().toString();
System.out.println("event.getSourceSwingEvent().getSource() = " + o);
o = event.getComponent().toString();
System.out.println("event.getComponent() = " + o);
o = event.getPickedNode().toString();
System.out.println("event.getPickedNode() = " + o);
}
});
};
};
}
}更新2
我的要求是将一些最顶层的虚拟节点作为包装器,因为它是子节点。我想将处理程序附加到父程序并跟踪下面的所有事件。同时,作为一个整体,父母可以是一个更复杂的场景的孩子。所以,我需要在某个中间级别捕捉事件。
发布于 2013-11-05 23:16:27
PInputEvent.getSourceSwingEvent()返回底层的swing事件-- InputEvent,从该事件中getSource()应该为您提供源代码,即:
event.getSourceSwingEvent().getSource()编辑:
看来event.getSourceSwingEvent().getSource()总是一个画布。这是有意义的,因为事件实际上起源于画布。
event.getPickedNode()是实际选中的节点。它可能是具有注册监听器的节点的子节点,例如发布的示例代码中的circle3。
我不知道这个场景是什么,也不知道为什么要找到一个注册了侦听器的节点。在大多数情况下,所需的输出是选中的节点。要找到要查找的内容,您可以使用PInputEventListener的自定义指定扩展,该扩展可以保存对注册它的节点的引用。这可能是一种过度,取决于一种情况。例如:
public static class MyEventHandler extends PBasicInputEventHandler {
private PNode node;
public MyEventHandler(PNode node) {
this.node = node;
}
public PNode getNode() {
return this.node;
}
}出现在脑海中的另一种讨厌的方法是遍历选中路径中的对象堆栈或节点层次结构,以找到具有此侦听器的节点。例如,要遍历节点的层次结构(同样,也可以枚举event.getPath().getNodeStackReference()中的节点):
public static PNode getRealEventSource(PInputEvent event, PInputEventListener listener) {
PNode node = event.getPickedNode();
while(node != null){
EventListenerList listeners = node.getListenerList();
if (listeners != null) {
if (Arrays.asList(listeners.getListenerList()).contains(listener)) {
return node;
}
}
node = node.getParent();
}
return null;
}然后,像这样从mouseClicked()方法中调用它:
System.out.println("The real source:" + getRealEventSource(event, this));https://stackoverflow.com/questions/19798430
复制相似问题