gpt4 book ai didi

java - 如何知道 Piccolo2D 中的输入事件处理程序所有者?

转载 作者:行者123 更新时间:2023-12-01 13:53:18 26 4
gpt4 key购买 nike

我在 PInputEvent 中没有看到 getSource() 方法类。

我想获取对已添加处理程序的对象的引用。

更新

在以下示例中,创建了三个同心圆。每个较大的圈子都拥有较小的圈子。鼠标点击处理程序附加到circle2。由于此圈子拥有 circle3,因此当单击 circle2circle3(而非 circle1)时,处理程序会触发。

如果点击circle3,如何从处理程序内获取对circle2的引用?

两种经过测试的方法都没有帮助。

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

我的要求是将一些最顶层的虚拟节点视为其子节点的包装器。我想将处理程序附加到父级并跟踪下面的所有事件。同时,父级可以是整个更复杂场景的子级。因此,我需要在某个中间级别捕获事件。

最佳答案

PInputEvent.getSourceSwingEvent()返回基础波动事件 - InputEvent ,从中 getSource() 应该为您提供源代码,即:

event.getSourceSwingEvent().getSource()

编辑:

看来 event.getSourceSwingEvent().getSource() 始终是 Canvas 。这是有道理的,因为该事件实际上起源于 Canvas 。

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

关于java - 如何知道 Piccolo2D 中的输入事件处理程序所有者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19798430/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com