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