Проблемы возникают из-за того, что вы добавляете слушателя к нескольким компонентам, но вы всегда обращаетесь к фрейму, чтобы получить компонент в. Что вы должны сделать, это:
Component c = ((Component)e.getSource()).getComponentAt(e.getX(), e.getY());
// Do some stuff about c.
Координаты события относятся к компоненту, который вызвал событие.