Возможно, вы сможете использовать Marquee Panel . В коде используются реальные компоненты, поэтому вы должны иметь возможность добавлять и реагировать на любого слушателя, которого вы добавляете к компонентам.
Edit:
Ой, я не знаю, о чем я думал, мой код использует метод Graphics.translate (...) для рисования компонентов, поэтому использование MouseListener напрямую не будет работать.
Edit2:
Может быть, следующий код поможет. Просто добавьте метод в класс MarqueePanel:
public Component getComponentAtPoint(Point p)
{
int translatedX = p.x + scrollOffset;
if (isWrap())
{
int preferredWidth = super.getPreferredSize().width;
preferredWidth += getWrapAmount();
translatedX = translatedX % preferredWidth;
}
Point translated = new Point(translatedX, p.y);
for (Component c: getComponents())
{
if (c.getBounds().contains(translated))
return c;
}
return null;
}
Теперь вы можете добавить MouseListener в MarqueePanel и затем вызвать этот метод, чтобы определить, для какого компонента был создан MouseEvent. Как только вы узнаете, по какому компоненту щелкнули, вам нужно будет вручную вызвать действие для этого компонента. Или вы можете попробовать повторно отправить MouseEvent к компоненту. Вам нужно будет воссоздать MouseEvent, чтобы сделать компонент источником события вместо панели, являющейся источником. Вам также нужно будет скрыть расположение событий X / Y относительно компонента, а не панели. Класс SwingUtils должен помочь с этим.