Вот что я сделал до сих пор, и, кажется, это работает хорошо.
У меня есть несколько компонентов GUI, которые включены в один большой графический интерфейс, но эти компоненты (и их события) должны использоваться за пределами этого интерфейса.
Большой графический интерфейс использует шаблон наблюдателя и ему назначен GUIController. Интерфейс GUIController имеет метод handleEventName для каждого события.
handleEventX(RangeChange changed);
handleEventY(AlgorithmChange alg);
Субкомпоненты вместо этого используют фактические события, которые распространяются вплоть до большого GUI, который может сам обрабатывать события через операторы switch или передавать их GUIController, который может, в свою очередь, CALL для действия в GUI (передача сообщений, я думаю) *