我在尝试拖动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());
}
我得到的元素反弹的效果要少得多,但它仍然可见,元素只移动鼠标指针的一半。为什么会发生这种情况?如何解决这种情况?
答案 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课程。