MouseEvent
で迷子になる、つまり親に配信されないことがわかっているようJScrollPane
に、これはまだ修正されていない古いバグです:
https://forums.oracle.com/forums/thread.jspa?threadID=1362237
JScrollPane
そのため、一時的なリスナーでイベントをキャッチし、実際のリスナーで処理される親であるイベントにディスパッチすることで回避策を使用していました。
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);
}
}
問題なく動作しましたが、Java 7 を使用している人々は、マウス クリックがアプリケーションで反応しないと不満を言い始めました。Java 6 にダウングレードした後、問題は解決しましたが、現在はテスト中Applet
であり、Chrome
プラグインをバージョン 7 にアップグレードする必要がありました。
デバッグ後、渡されたボタンから独立してconvertMouseEvent
ボタンを設定することがわかりましたMouseEvent.NOBUTTON
MouseEvent newMe = SwingUtilities.convertMouseEvent(pane.getViewport(), me, tablePanel);
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;
なぜそのように実装されているのかわかりませんか?それは別のバグまたは機能ですか?
SwingUtilities.convertMouseEvent
sourceEvent からボタンを呼び出して設定せずに、独自のオブジェクトを作成する必要があるようです。