【问题标题】:Mouse Dragging Logic鼠标拖动逻辑
【发布时间】:2011-03-21 23:34:13
【问题描述】:

这里有一些代码可以让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();
}

有人可以解释为什么会这样吗?似乎我的代码的两个版本都在使用相同的想法......基本上在第一种情况下,我采用原始的GObjectset 它的位置基于与我原来位置的差异,在第二种情况下如果我根据与原始位置的差异移动原始对象。

【问题讨论】:

    标签: java logic


    【解决方案1】:

    move()setLocation() 的已弃用同义词。

    一个不起作用而另一个起作用的原因是您向其中输入了不同的参数。 (特别是在第二种情况下,您总是调用move(0,0)。)

    java.awt.Component 源代码中的 sn-p 证实了这一点:

    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(0,0);我准确地将我的新x,y 位置和我的原始位置之间的区别称为delta。所以是的,虽然move 方法类似于设置位置,但对我来说还没有意义,为什么它不移动对象的位置。
    • @Steven 恐怕你错了。您将 DX 计算为DX = -e.getX();,然后使用e.getX() + DX 调用move(),即e.getX() -e.getX(),它为零。就像我为您复制的代码所示,move()setLocation() 不同,它是完全相同的方法,但名称不同。
    • 这是否正确:当我按下鼠标时,它会记录我鼠标位置的初始值(当然是负数)。当我拖动鼠标时,它为 DX 和 DY 保存相同的初始值并将它们添加到新的 e.getX() 等......所以我不应该移动一些非零值吗?我的想法是,如果您在这里是正确的,那么第一个示例的逻辑会发生什么变化。看来我在这两种情况下都使用相同的逻辑。
    • @Steven 尝试与第一个示例完全相同的代码,但用move() 替换setLocation()。你会发现它的行为完全一样。
    【解决方案2】:

    虽然第一个示例将 DXDY 设置为相对于您当前的标签位置,但第二个示例忽略了标签当前位置的当前位置。

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

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

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

    【讨论】:

    • 请注意,在第二种情况下,我没有设置位置,我只是使用move 方法移动对象。所以是的,我应该将对象移动 (30,30),这确实是正确的。所以这对我没有帮助。
    • @Steven 你正在设置位置,不管你怎么想。
    • @biziclop 是的,我正在设置位置,但我将位置设置为 `e.getX() - e.getX() + currentLabel.get(X) 的旧值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多