我在JScrollPane中有一個JPanel。 JPanel有一個MouseListener,用於響應鼠標事件。當我將JPanel直接添加到父JComponent(其間沒有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)右下角(對於尺寸爲600x400的JPanel)返回(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'附加到別的東西上。發佈一個[SSCCE](http://pscode.org/sscce.html),如** mMorbel **所發佈的那樣,以證明不然。 –
是的,如果沒有擴展的代碼示例(包括如何創建JPanel/JScrollPane) - 理想地發佈兩個描述這兩種情況的示例,很難/不可能診斷此問題。 –
'JPanel'的默認佈局是'FlowLayout';查看對@ mKorbel的答案的評論。 – trashgod