Java JPanel子类;跳来跳去;拖拽

Java JPanel子类;跳来跳去;拖拽,java,swing,jpanel,drag,mousemotionlistener,Java,Swing,Jpanel,Drag,Mousemotionlistener,我目前正在编写一个小的“绘画”程序;到目前为止,你可以用笔在上面画画,放大到100倍,然后选择一种颜色。我想添加的下一件事是(或是)拖动JPanel子类的可能性,选择要编辑的图像是在该子类上绘制的。基本上,通过按住鼠标右键,可以更改位于JInternalFrame上的JPanel子类的位置。我有一个代码示例,它本身应该运行良好;至少对我来说是这样。要复制此问题,只需启动DragPanelTest类,并在带有红色边框的组件上拖动鼠标-面板不会平滑拖动,而是始终来回跳跃 代码: 请注意,我遗漏了一些

我目前正在编写一个小的“绘画”程序;到目前为止,你可以用笔在上面画画,放大到100倍,然后选择一种颜色。我想添加的下一件事是(或是)拖动JPanel子类的可能性,选择要编辑的图像是在该子类上绘制的。基本上,通过按住鼠标右键,可以更改位于JInternalFrame上的JPanel子类的位置。我有一个代码示例,它本身应该运行良好;至少对我来说是这样。要复制此问题,只需启动
DragPanelTest
类,并在带有红色边框的组件上拖动鼠标-面板不会平滑拖动,而是始终来回跳跃

代码:

请注意,我遗漏了一些
System.out.println()
@Override
命令以将代码缩短一点

无论如何,如果有人知道我做错了什么/需要改进什么,我将非常感激

面板不会平滑拖动,而是始终来回跳跃

由于鼠标与零部件和父面板之间的相对运动处于禁用状态,因此发生跳跃时。您的代码太复杂,无法指出导致问题的确切行

围绕面板拖动零部件的基本代码是:

public class DragListener extends MouseInputAdapter
{
    Point location;
    MouseEvent pressed;

    public void mousePressed(MouseEvent me)
    {
        pressed = me;
    }

    public void mouseDragged(MouseEvent me)
    {
        Component component = me.getComponent();
        location = component.getLocation(location);
        int x = location.x - pressed.getX() + me.getX();
        int y = location.y - pressed.getY() + me.getY();
        component.setLocation(x, y);
     }
}

有关具有更多功能的更高级代码,您还可以查看中的
组件移动器
类。

我在移动滚动窗格的视口时遇到类似问题。我认为,重新定位零部件时,保存点的值相对于原始位置,相对于新位置不正确。我的解决方案在我看来似乎不合逻辑,使拖动操作顺利进行。我所做的是将点增量添加回保存的位置

这是拖动视口的基本代码:

Point priorPanPoint;

public void mouseDragged(MouseEvent e) {
    Point newPt = subtractPoints(priorPanPoint, e.getPoint());
    priorPanPoint = addPoints(e.getPoint(), newPt);
    newPt = addPoints(getVisibleRect().getLocation(), newPt);
    viewport.setViewPosition(newPt);
}

public void mousePressed(MouseEvent e) {
    priorPanPoint = e.getPoint();
}

private Point addPoints(Point p1, Point p2) {
    return  new Point(p1.x + p2.x, p1.y + p2.y); }

private Point subtractPoints(Point p1, Point p2) {
    return new Point(p1.x - p2.x, p1.y - p2.y);
}

它之所以跳跃是因为
getMousePosition
。这是相对于当前组件的,但是,由于该组件正在移动,它会影响代码认为鼠标上次移动的位置。
Point priorPanPoint;

public void mouseDragged(MouseEvent e) {
    Point newPt = subtractPoints(priorPanPoint, e.getPoint());
    priorPanPoint = addPoints(e.getPoint(), newPt);
    newPt = addPoints(getVisibleRect().getLocation(), newPt);
    viewport.setViewPosition(newPt);
}

public void mousePressed(MouseEvent e) {
    priorPanPoint = e.getPoint();
}

private Point addPoints(Point p1, Point p2) {
    return  new Point(p1.x + p2.x, p1.y + p2.y); }

private Point subtractPoints(Point p1, Point p2) {
    return new Point(p1.x - p2.x, p1.y - p2.y);
}