JScrollPane内にJPanelがあります。 JPanelにはマウスイベントに反応するようにMouseListenerが添付されています。親JComponentにJPanelを直接追加すると(その間のJScrollPaneを除く)、すべて正常に動作します。 JScrollPaneをミックスに追加すると、JPanelのイベントハンドラに送信されたマウス座標は、すべてx軸とy軸の両方に正のオフセットを持ちます。JScrollPane内のJPanelでのマウス座標のオフセット
例(JPanelの上でマウスリスナー):
public void mousePressed(MouseEvent ev) {
System.out.println(ev.getPoint());
System.out.println(this.getMousePosition());
}
私はJPanelの代わりに、(0,0)の左上隅をクリックして、私は(5,60)のようなものを取得する機能の両方からしばらく(JPanelのサイズが600x400の場合)は(605,460)を返します。この線形オフセットがどこから来たのか?
編集:私は単純なテストケースに縮小し、期待どおりに動作します。だから、私の周囲のコードのなかで、この動作を引き起こすものでなければなりません。
public class JScrollPaneTest {
public static void main(String[] args) {
JFrame window = new JFrame();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.getContentPane().setLayout(new BorderLayout());
MyPanel panel = new MyPanel();
window.getContentPane().add(new JScrollPane(panel), BorderLayout.CENTER);
window.setSize(new Dimension(600, 400));
window.setVisible(true);
}
}
public class MyPanel extends JPanel implements MouseListener, Scrollable {
public MyPanel() {
setLayout(null);
addMouseListener(this);
this.setAutoscrolls(true);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(2000, 2000);
}
@Override
public void mousePressed(MouseEvent ev) {
System.out.println("Event mouse position: " + ev.getPoint());
System.out.println("Panel mouse position: " + this.getMousePosition());
}
}
*「JPanelにはMouseListenerが添付されています。」*私のベスト・ベットは、「MouseListener」が別のものに添付されていることです。そうでないことを証明するために、** mMorbel **によって投稿されたような[SSCCE](http://pscode.org/sscce.html)を投稿してください。 –
JPanel/JScrollPaneの作成方法を含め、拡張コードのサンプルを使用せずに、これを診断することは困難です。理想的には、記述した2つの状況を示す2つのサンプルを投稿することが理想的です。 –
'JPanel'のデフォルトレイアウトは' FlowLayout'です。 @ mKorbelの答えに対するコメントを見てください。 – trashgod