0

我在课堂上看不到任何getSource()方法。PInputEvent

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

更新

在以下示例中,创建了三个同心圆。每个较大的圆圈拥有较小的圆圈。鼠标点击处理程序附加到circle2. 由于这个圈子拥有,处理程序在单击和circle3时触发,但不是。circle2circle3circle1

如果单击,如何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

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

4

1 回答 1

1

PInputEvent.getSourceSwingEvent()返回底层的摇摆事件 - 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));
于 2013-11-05T23:16:27.067 回答