Начиная с jdk7, вы можете украсить любой JComponent с помощью JLayer и зарегистрировать слой, чтобы получать все события, отправленные его дочерним элементам, что-то вроде
JTable list = new JTable(30, 5);
JComponent panel = new JPanel(new BorderLayout());
panel.setBorder(BorderFactory.createEmptyBorder(50, 50, 50, 50));
panel.add(new JLabel("we are label"));
panel.add(new JScrollPane(list));
LayerUI<JComponent> ui = new LayerUI<JComponent>() {
@Override
protected void processMouseEvent(MouseEvent e, JLayer<? extends JComponent> l) {
if (e.getID() == MouseEvent.MOUSE_ENTERED) {
System.out.println(e.getSource().getClass() + " at " + e.getPoint());
}
}
};
JLayer<JComponent> layer = new JLayer<JComponent>(panel, ui);
layer.setLayerEventMask(AWTEvent.MOUSE_EVENT_MASK );
Обратите внимание, что это внутренне обрабатывается AWTEventListener, как и решение, предложенное в блоге Роба. Преимущество решения Роба в том, что оно будет работать и в изолированной среде (поскольку у базового класса JLayer есть необходимые привилегии).
Для более ранних версий jdk существует проект JXLayer (часть SwingLabs), который является прямым предшественником нового базового класса. У него нет проблем с разрешениями, потому что он внутренне использует немного другой подход для захвата всех событий.