【发布时间】:2011-07-05 13:55:46
【问题描述】:
我在 JScrollPane 中有一个 JPanel。 JPanel 附加了一个 MouseListener 以响应鼠标事件。当我将 JPanel 直接添加到父 JComponent(中间没有 JScrollPane)时,它都可以正常工作。一旦我将 JScrollPane 添加到组合中,发送到 JPanel 上的事件处理程序的鼠标坐标在 x 和 y 轴上都有一个正偏移。
示例(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,就像 mMorbel 发布的那样,以证明并非如此。 -
是的,如果没有扩展代码示例(包括您如何创建 JPanel/JScrollPane)很难/不可能诊断此问题 - 理想情况下,发布两个示例来描述您描述的两种情况。
-
JPanel的默认布局是FlowLayout;请参阅@mKorbel 的答案。
标签: java swing event-handling jpanel jscrollpane