Java 拖动JPanel

Java 拖动JPanel,java,events,swing,mouse,drag,Java,Events,Swing,Mouse,Drag,我在尝试拖动JPanel时遇到问题。如果我纯粹在MouseDragged中实现它,则如下所示: public void mouseDragged(MouseEvent me) { me.getSource().setLocation(me.getX(), me.getY()); } 我得到一个奇怪的效果,移动的对象一直在两个位置之间反弹(生成更多的“拖动”事件)。如果我按照中所述的方式进行,但是: public void mouseDragged(MouseEvent me) {

我在尝试拖动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();
}

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


我的通用类就是这个类。

好的。老问题,但如果有人遇到像我这样的问题,这可以相对简单地解决。为了在
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

结束时更新调整。如果拖动导致查看区域滚动,您的方法(在屏幕上保存位置)是否会中断?必须承认我从未尝试在滚动窗格中拖动组件。因此,被拖动的元素跳到窗口的左上角-但拖动至少是可预测的…实际上-这在
鼠标按下的情况下不需要翻译。还是不知道为什么。