首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Piccolo2D中了解输入事件处理程序所有者?

如何在Piccolo2D中了解输入事件处理程序所有者?
EN

Stack Overflow用户
提问于 2013-11-05 20:35:38
回答 1查看 144关注 0票数 0

getSource()类中没有看到任何PInputEvent方法。

我希望获得对一个对象的引用,该对象被添加到哪个处理程序中。

更新

在下面的示例中,创建了三个同心圆。每一个大的圆圈都有一个小的。鼠标单击处理程序附加到circle2。因为这个循环拥有circle3,所以当单击circle2circle3而不是circle1时,就会触发处理程序。

如果单击到circle2,如何从处理程序中获取对circle3的引用

这两种测试方法都没有帮助。

代码语言:javascript
复制
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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-05 23:16:27

PInputEvent.getSourceSwingEvent()返回底层的swing事件-- InputEvent,从该事件中getSource()应该为您提供源代码,即:

代码语言:javascript
复制
event.getSourceSwingEvent().getSource()

编辑:

看来event.getSourceSwingEvent().getSource()总是一个画布。这是有意义的,因为事件实际上起源于画布。

event.getPickedNode()是实际选中的节点。它可能是具有注册监听器的节点的子节点,例如发布的示例代码中的circle3

我不知道这个场景是什么,也不知道为什么要找到一个注册了侦听器的节点。在大多数情况下,所需的输出是选中的节点。要找到要查找的内容,您可以使用PInputEventListener的自定义指定扩展,该扩展可以保存对注册它的节点的引用。这可能是一种过度,取决于一种情况。例如:

代码语言:javascript
复制
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()中的节点):

代码语言:javascript
复制
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()方法中调用它:

代码语言:javascript
复制
System.out.println("The real source:" + getRealEventSource(event, this));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19798430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档