As we know MouseEvent
gets lost in JScrollPane
, i.e. not delivered to a parent, it is an old bug not fixed yet:
https://forums.oracle.com/forums/thread.jspa?threadID=1362237
So I was using work-around by catching event in JScrollPane
with a temporary listener and then dispatching event to it is parent to be processed with a real listener.
private class DispatchListener extends MouseAdapter {
@Override
public void mousePressed (MouseEvent me) {
System.out.println("dispatch.mousePressed: " + me.getButton());
preDispatchEvent(me);
}
@Override
public void mouseReleased (MouseEvent me) {
preDispatchEvent(me);
}
@Override
public void mouseDragged (MouseEvent me) {
System.out.println("dispatch.mouseDragged");
preDispatchEvent(me);
}
private void preDispatchEvent (MouseEvent me) {
JScrollPane pane = (JScrollPane)me.getSource();
MouseEvent newMe = SwingUtilities.convertMouseEvent(pane.getViewport(), me, tablePanel);
dispatchEvent(newMe);
}
}
It worked okay, but people with Java 7 started to complain that mouse click has no reaction in the application. After downgrading to Java 6 the issue was resolved, but now I was testing Applet
and Chrome
forced me to upgrade plugin to version 7.
After debugging I have figure out that convertMouseEvent
sets button to MouseEvent.NOBUTTON
independant of button passed
MouseEvent newMe = SwingUtilities.convertMouseEvent(pane.getViewport(), me, tablePanel);
From source code in Eclipse
else {
newEvent = new MouseEvent(newSource,
sourceEvent.getID(),
sourceEvent.getWhen(),
sourceEvent.getModifiers(),
p.x,p.y,
sourceEvent.getXOnScreen(),
sourceEvent.getYOnScreen(),
sourceEvent.getClickCount(),
sourceEvent.isPopupTrigger(),
MouseEvent.NOBUTTON ); //!!!
}
return newEvent;
I don't know why is it implemented that way? Is it another bug or feature?
Seems like I need to create my own object without calling SwingUtilities.convertMouseEvent
and set button from sourceEvent.