0

我正在使用 Piccolo2D 库在画布上绘制节点。我已经在 Piccolo2D 的示例中设置了 PSelectionEventHandler:SelectionExample.java ,然后我在

private void nodeSelected(final PNotification n)
{
}   // nodeSelected

但是当我选择节点时,不会调用回调。为什么?

编辑:(取自OP的回答)

好的,代码如下:

在主 JFrame 中:

this.panelMain().panelWorkspace().canvas().addInputEventListener(
this.handlerCanvasSelection());
this.panelMain().panelWorkspace().canvas().getRoot().getDefaultInputManager().
     setKeyboardFocus(this.handlerCanvasSelection());

PNotificationCenter.defaultCenter().addListener(this, "nodeSelected",
                PSelectionEventHandler.SELECTION_CHANGED_NOTIFICATION,
                this.handlerCanvasSelection());

private void nodeSelected(final PNotification n)
{
}   // nodeSelected
4

1 回答 1

1

问题是nodeSelected()声明了注册为回调的方法private。的实现PNotificationCenter.addListener()使用反射来查找和注册回调方法。它实际上使用Class.getMethod()which 只返回公共方法。因此,如果未找到该方法(无论出于何种原因),则未注册侦听器。

考虑这个演示SELECTION_CHANGED_NOTIFICATION通知的简单示例:

在此处输入图像描述

import java.awt.*;
import javax.swing.*;
import edu.umd.cs.piccolo.*;
import edu.umd.cs.piccolo.nodes.*;
import edu.umd.cs.piccolox.event.*;

public class TestSelectHandle {

    private static void createAndShowUI() {
        JFrame frame = new JFrame("TestSelectHandle");
        PCanvas canvas = new PCanvas() {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(100, 200);
            }
        };

        final JTextArea output = new JTextArea(5, 20);

        JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT,
                canvas, output);
        frame.add(splitPane);

        final PNode blueRect = PPath.createRectangle(50, 50, 50, 50);
        blueRect.setPaint(Color.BLUE);
        canvas.getLayer().addChild(blueRect);

        final PNode redRect = PPath.createRectangle(110, 110, 50, 50);
        redRect.setPaint(Color.RED);
        canvas.getLayer().addChild(redRect);

        canvas.removeInputEventListener(canvas.getPanEventHandler());
        canvas.removeInputEventListener(canvas.getZoomEventHandler());

        PSelectionEventHandler selectionHandler = new PSelectionEventHandler(
                canvas.getLayer(), canvas.getLayer());
        canvas.addInputEventListener(selectionHandler);
        canvas.getRoot().getDefaultInputManager()
                .setKeyboardFocus(selectionHandler);

        PNotificationCenter.defaultCenter().addListener(
                new NodeSelectionListener(output), "selectionChanged",
                PSelectionEventHandler.SELECTION_CHANGED_NOTIFICATION,
                selectionHandler);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static class NodeSelectionListener {
        private JTextArea output;

        public NodeSelectionListener(JTextArea output) {
            this.output = output;
        }

        public void selectionChanged(final PNotification notfication) {
            output.append("selection changed\n");
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowUI();
            }
        });
    }
}
于 2012-12-21T04:44:23.477 回答