PSelectionEventHandler не запускает обратный вызов

Я использую библиотеку Piccolo2D для рисования узлов на холсте. Я настроил PSelectionEventHandler, как в примере Piccolo2D по адресу: SelectionExample.java, а затем я установил точку останова в

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

но когда я выбрал узел, обратный вызов не вызывается. Зачем?

РЕДАКТИРОВАТЬ: (взято из ответа ОП)

Хорошо, вот код:

В основном 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

1 ответ

Решение

Проблема в том, что nodeSelected() метод, который зарегистрирован как обратный вызов, объявлен private, Реализация PNotificationCenter.addListener() использует отражение для поиска и регистрации метода обратного вызова. Это на самом деле использует Class.getMethod() который возвращает только публичные методы. Поэтому, если метод не найден (по какой-либо причине), слушатель не регистрируется.

Рассмотрим этот простой пример, который демонстрирует 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();
            }
        });
    }
}
Другие вопросы по тегам