次のコードがあるとします。
public LSUIEditingPanel(LSView view) {
super();
parent = view;
controller = view.getController();
LayoutManager overlay = new OverlayLayout(this);
setLayout(overlay);
scribbleArea = new LSScribblePanel();
scribbleArea.setOpaque(false);
add(scribbleArea);
viewArea = new LSCanvasViewport(view);
add(viewArea);
setAutoscrolls(true);
drawListener = new SVGEditorDrawMouseAdaptor();
}
scribbleArea と viewArea はどちらもカスタム JPanel です。どちらもメイン パネルに追加されたサブパネルです。
ここで、MouseEvent を親パネル自体に登録できるようにしたいと考えています。これは、親パネルがインスタンス化後に JScrollPane に組み込まれるため、パネルのパンを行うことができるということです。
これは、ドラッグを実行するコード セグメントです。
public class LSPanMouseAdapter extends MouseAdapter {
/**
* Panning pivot point
*/
private final Point panPoint = new Point();
/**
* {@inheritDoc}<p>
* Set pan starting point to be the point where the mouse currently located, and change the
* current cursor to <code>HAND_CURSOR</code>.
*/
@Override
public void mousePressed(MouseEvent event) {
JViewport viewport = (JViewport) event.getSource();
JComponent component = (JComponent) viewport.getView();
panPoint.setLocation(event.getPoint());
component.setCursor(new Cursor(Cursor.HAND_CURSOR));
}
/**
* {@inheritDoc}<p>
* Reset cursor to <code>DEFAULT_CURSOR</code>.
*/
@Override
public void mouseReleased(MouseEvent event) {
JViewport viewport = (JViewport) event.getSource();
JComponent component = (JComponent) viewport.getView();
component.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
}
/**
* {@inheritDoc}<p>
* Get the current viewport of the canvas and move the viewable area respective to the
* event cursor location.
*/
@Override
public void mouseDragged(MouseEvent event) {
JViewport viewport = (JViewport) event.getSource();
JComponent component = (JComponent) viewport.getView();
Point currentPoint = event.getPoint();
Point viewPoint = viewport.getViewPosition();
viewPoint.translate(panPoint.x - currentPoint.x, panPoint.y - currentPoint.y);
component.scrollRectToVisible(new Rectangle(viewPoint, viewport.getSize()));
panPoint.setLocation(currentPoint);
}
}
イベントを登録しようとしましたが、親パネルがイベントを発生させません。これを行う方法について何か提案はありますか?