Логика перетаскивания мышью - PullRequest
2 голосов
/ 22 марта 2011

Вот некоторый код, который заставляет 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 и , устанавливающее его местоположение, основываясь на отличии от моей исходной позиции, а во втором случае Я перемещаю исходный объект, основываясь на отличии от моей исходной позиции.

Ответы [ 2 ]

0 голосов
/ 22 марта 2011

В то время как первый пример устанавливает DX и DY относительно вашего текущего местоположения метки, во втором примере игнорируется текущее местоположение текущего местоположения вашей метки.

Например, если ваша текущая меткаместоположение (50,50), и вы хотите переместить его на (30,30).если вы нажимаете мышь, когда указываете на (70,70) (при условии, что оно находится в пределах границ метки):

В вашем первом примере DX будет установлен на -20, а DY будет установлен на -20.Теперь после перетаскивания новое местоположение будет (как mouseDragged реализует) ((70 + 30) -20, (70 + 30) -20) = (80, 80), что является правильным.

Во втором примере DX будет установлен на -70, а также DY.Теперь после перетаскивания новое местоположение будет (100-70, 100-70) = (30,30), что неверно.

0 голосов
/ 22 марта 2011

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...