拖动JPanel

时间:2010-09-18 02:27:42

标签: java events swing mouse drag

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

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

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

public void mouseDragged(MouseEvent me) {
   if (draggedElement == null)
      return;

   me.translatePoint(this.draggedXAdjust, this.draggedYAdjust);
   draggedElement.setLocation(me.getX(), me.getY());
}

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

3 个答案:

答案 0 :(得分:4)

行。老问题,但如果有人遇到这个像我这样做,这可以相对简单地解决。要拖动我JPanel中的JFrame

    @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每次通话结束时更新调整。

答案 1 :(得分:1)

试试这个

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();
}

答案 2 :(得分:1)

我不知道您是否可以使用mouseDragged事件来执行此操作。在过去我使用mousePressed来保存原始点并拖动鼠标以获得当前点。在这两种情况下,我都将点转换为屏幕上的位置。然后,可以轻松计算两点之间的差异,并可以适当地设置位置。

我的通用课程是Component Mover课程。