拖动JPanel

我在尝试拖动JPanel时遇到了问题。 如果我纯粹在MouseDragged中实现它:

public void mouseDragged(MouseEvent me) { me.getSource().setLocation(me.getX(), me.getY()); } 

我得到了移动物体一直在两个位置之间弹跳的奇怪效果(产生更多“拖动”事件)。 如果我按照这篇文章中描述的方式进行,但是:

 public void mouseDragged(MouseEvent me) { if (draggedElement == null) return; me.translatePoint(this.draggedXAdjust, this.draggedYAdjust); draggedElement.setLocation(me.getX(), me.getY()); } 

我得到的元素弹跳效果要少得多,但它仍然可见,元素只移动鼠标指针的一半。 为什么会发生这种情况/如何解决这种情况?

试试这个

 final Component t = e.getComponent(); e.translatePoint(getLocation().x + t.getLocation().x - px, getLocation().y + t.getLocation().y - py); 

并添加此方法:

 @Override public void mousePressed(final MouseEvent e) { e.translatePoint(e.getComponent().getLocation().x, e.getComponent().getLocation().y); px = e.getX(); py = e.getY(); } 

好。 老问题,但如果有人遇到这个像我这样做,这可以相对简单地解决。 为了在JFrame拖动JPanel ,我做了:

  @Override public void mousePressed(MouseEvent e) { if (panel.contains(e.getPoint())) { dX = e.getLocationOnScreen().x - panel.getX(); dY = e.getLocationOnScreen().y - panel.getY(); panel.setDraggable(true); } } @Override public void mouseDragged(MouseEvent e) { if (panel.isDraggable()) { panel.setLocation(e.getLocationOnScreen().x - dX, e.getLocationOnScreen().y - dY); dX = e.getLocationOnScreen().x - panel.getX(); dY = e.getLocationOnScreen().y - panel.getY(); } } 

关键是使用.getLocationOnScreen()并在每次调用mouseDragged更新调整。

我不知道你是否可以使用mouseDragged事件来做到这一点。 在过去,我使用mousePressed保存原始点并拖动鼠标以获取当前点。 在这两种情况下,我都将点转换为屏幕上的位置。 然后,可以容易地计算两点之间的差异,并且可以适当地设置位置。

我的通用类是Component Mover类。