Java 鼠标拖动逻辑

Java 鼠标拖动逻辑,java,logic,Java,Logic,下面是一些代码,它可以使gcombound通过拖动正确移动 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 = curren

下面是一些代码,它可以使
gcombound
通过拖动正确移动

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(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);
    }
}
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和DY都将设置为-70。现在,拖动后,新位置将是(100-70,100-70)=(30,30),这是错误的。

而第一个示例将
DX
DY
设置为相对于当前标签位置,第二个示例忽略标签当前位置的当前位置

例如,如果当前标签位置为(50,50),并且希望将其移动(30,30)。如果在指向(70,70)时按下鼠标(假设在标签边界内):

在第一个示例中,DX将设置为-20,DY将设置为-20。现在,拖动后,新位置将是(如
mouseDragged
implements)((70+30)-20,(70+30)-20)=(80,80),这是正确的


在第二个示例中,DX和DY将设置为-70。现在,拖动后,新位置将为(100-70,100-70)=(30,30),这是错误的。

谢谢。但我认为,实际上,当我拖动鼠标时,我不会调用
move(0,0)
;我精确地调用了我的新
x,y
位置和我的原始位置之间的差异,这给了我增量。因此,是的,
move
方法与设置的位置相似,但我还不明白为什么它不移动对象的位置。@Steven恐怕你错了。将DX计算为
DX=-e.getX()
,然后用
e.getX()+DX
调用
move()
,它是
e.getX()-e.getX()
,它是零。正如我为您复制的代码所示,
move()
setLocation()
不同,它是完全相同的方法,但名称不同。是否正确:当我按下鼠标时,它会记录鼠标位置的初始值(当然是负值)。当我拖动鼠标时,它会保持DX和DY的相同初始值,并将它们添加到新的e.getX()中,等等。。。所以我不应该移动一些非零值吗?我的想法是,如果你在这里是正确的,那么第一个例子的逻辑会发生什么变化。似乎我在这两种情况下使用了相同的逻辑。@Steven尝试了与第一个示例完全相同的代码,但将
move()
替换为
setLocation()
。你会发现它的行为完全一样。谢谢。但我认为,实际上,当我拖动鼠标时,我不会调用
move(0,0)
;我精确地调用了我的新
x,y
位置和我的原始位置之间的差异,这给了我增量。因此,是的,
move
方法与设置的位置相似,但我还不明白为什么它不移动对象的位置。@Steven恐怕你错了。将DX计算为
DX=-e.getX()
,然后用
e.getX()+DX
调用
move()
,它是
e.getX()-e.getX()
,它是零。正如我为您复制的代码所示,
move()
setLocation()
不同,它是完全相同的方法,但名称不同。是否正确:当我按下鼠标时,它会记录鼠标位置的初始值(当然是负值)。当我拖动鼠标时,它会保持DX和DY的相同初始值,并将它们添加到新的e.getX()中,等等。。。所以我不应该移动一些非零值吗?我的想法是,如果你在这里是正确的,那么第一个例子的逻辑会发生什么变化。似乎我在这两种情况下使用了相同的逻辑。@Steven尝试了与第一个示例完全相同的代码,但将
move()
替换为
setLocation()
。您会发现它的行为完全相同。请注意,在第二种情况下,我没有设置位置,我只是使用
move
方法移动对象。是的,我应该移动物体(30,30),这是正确的。所以这对我没有帮助。@Steven您正在设置位置,不管您怎么想。@biziclop是的,我正在设置位置,但我正在将位置设置为'e.getX()-e.getX()+currentLabel.get(X)的旧值。请注意,在第二种情况下,我没有设置位置,我只是使用
move
方法移动对象。所以是的,我应该移动物体(30)