Похоже, что дополнительным ограничением является то, что класс ActionListener не имеет аргументов конструктора, что добавляет здесь оскорбление травмы.Насколько я вижу, addActionListener, вероятно, просто хранит имя класса объекта, переданного ему.
Фактически, если целью было сделать этого слушателя непригодным для использования, предотвращая передачу любых данных слушателю с вашей поддержки.bean, они вряд ли могли бы сделать больше.
Вы получаете другое IllegalStateException, если вы пытаетесь создать подкласс MenuItem.
Вы не можете передать объект, содержащий данные, в MenuItem в качестве значения, для него требуется строка
Кажется, что слушатель не может быть внутренним классом.
Но я думаю, что, возможно, взломал его, поместив необходимые данные в карту атрибутов пункта меню.
Вот что я получил:
public class MenuSelectListener implements ActionListener {
public static final String MENU_ACTION_KEY = "menu.action.delegate";
private final static Log log = LogFactory.getLog(MenuSelectListener.class);
@Override
public void processAction(ActionEvent ae) throws AbortProcessingException {
System.out.println("listener invoked");
if (ae.getComponent() instanceof MenuItem) {
Runnable delegate = (Runnable) ae.getComponent().getAttributes().get(MENU_ACTION_KEY);
if(delegate != null)
delegate.run();
else
log.error("Menu action has no runnable");
} else {
log.error("Listener, wrong component class: " + ae.getComponent().getClass().getName());
}
}
}
Чтобы настроить элемент: -
item.setValue("Cancel");
sm.getChildren().add(item);
item.addActionListener(new MenuSelectListener());
item.getAttributes().put(MenuSelectListener.MENU_ACTION_KEY, new MiscActionDelegate(MiscActions.close));
С:
private class MiscActionDelegate implements Runnable, Serializable {
(работает как внутренний класс, но не может быть анонимным).