鼠标拖动逻辑
问题描述:
下面是一些代码,它使GCompound
在拖动时可以正确移动。鼠标拖动逻辑
public void mouseDragged(MouseEvent e) {
currentLabel.setLocation(e.getX()+DX, e.getY()+DY);
}
public void mousePressed(MouseEvent e) {
currentLabel = (coolLabel) getElementAt(e.getX(),e.getY());
DX = currentLabel.getX()-e.getX();
DY = currentLabel.getY()-e.getY();
currentLabel.sendToFront();
}
这是没有它正确移动:
public void mouseDragged(MouseEvent e)
{
currentLabel.move(e.getX()+DX, e.getY()+DY);
}
public void mousePressed(MouseEvent e) {
currentLabel = (coolLabel) getElementAt(e.getX(),e.getY());
DX = -e.getX();
DY = -e.getY();
currentLabel.sendToFront();
}
有人能解释为什么会是这样?看来我的代码版本都将使用相同的想法...基本上在我把原来的GObject
和集基于来自我原来的位置的不同其位置在第一种情况下,和在第二种情况下我移动原基于与我原来的位置不同的对象。
答
move()
是setLocation()
的已弃用同义词。
一个不工作,另一个不工作的原因是你喂入不同的参数。 (具体地,在第二种情况下,你总是调用move(0,0)
。)
从java.awt.Component
源代码的片段证实了这一点:
public void setLocation(int x, int y) {
move(x, y);
}
@Deprecated
public void move(int x, int y) {
synchronized(getTreeLock()) {
setBoundsOp(ComponentPeer.SET_LOCATION);
setBounds(x, y, width, height);
}
}
答
虽然第一示例设置DX
和DY
相对到当前标签的位置,所述第二示例会忽略标签当前位置的当前位置。
例如,如果您当前的标签位置是(50,50),并且您想将其移动(30,30)。如果您在指向(70,70)时按下鼠标(假设它位于标签边界内):
在您的第一个示例中,DX将设置为-20,DY将设置为-20。现在,在拖动新位置后(如mouseDragged
implements)((70 + 30)-20,(70 + 30)-20)=(80,80)这是正确的。
在你的第二个例子中,DX将被设置为-70,以及DY。现在,在拖动之后,新的位置将是(100-70,100-70)=(30,30),这是错误的。
谢谢。但我认为,实际上当我拖动鼠标时,我不会调用'move(0,0)';我恰恰调用了我的新“x,y”位置和我原来的**之间的区别。所以,当“移动”方法与设置位置相似时,它对我来说没有意义,为什么它不移动对象的位置。 – Steven 2011-03-21 23:56:31
@Steven我怕你错了。你计算DX为'DX = -e.getX();',然后你用'e.getX()+ DX'调用'move()',这是'e.getX()-e.getX()' ,这是零。就像我为你复制的代码所显示的那样,'move()'与'setLocation()'并不相似,它在不同的名字下完全一样。 – biziclop 2011-03-22 00:04:12
这是否正确:当我按下鼠标时,它记录了我的鼠标位置的初始值(当然是负值)。当我拖动鼠标,它为DX和DY保留相同的初始值,并将它们添加到新的e.getX()等...所以我不应该移动一些非零值?我的想法是,如果你在这里是正确的,那么第一个例子的逻辑将改变什么。看来我在这两种情况下都使用相同的逻辑。 – Steven 2011-03-22 00:07:45