Перетаскивание JPanel - PullRequest
       40

Перетаскивание JPanel

2 голосов
/ 18 сентября 2010

У меня проблема при попытке перетащить JPanel.Если я реализую это чисто в MouseDragged как:

public void mouseDragged(MouseEvent me) {
   me.getSource().setLocation(me.getX(), me.getY());
}

, я получаю странный эффект от того, что перемещенный объект все время подпрыгивает между двумя позициями (генерируя больше «перетаскиваемых» событий).Если я сделаю это так, как описано в этом посте , но с:

public void mouseDragged(MouseEvent me) {
   if (draggedElement == null)
      return;

   me.translatePoint(this.draggedXAdjust, this.draggedYAdjust);
   draggedElement.setLocation(me.getX(), me.getY());
}

, я получу эффект отскока элемента намного меньше, но он все еще виден и элемент перемещаетсятолько ½ пути указателя мыши.Почему это происходит / как я могу исправить эту ситуацию?

Ответы [ 3 ]

4 голосов
/ 06 августа 2011

OK. Старый вопрос, но если кто-нибудь сталкивается с этим, как я, это можно решить относительно просто. Для перетаскивания 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 голос
/ 19 сентября 2010

Я не знаю, можете ли вы просто сделать это с помощью события mouseDragged. В прошлом я использовал mousePressed, чтобы сохранить исходную точку, и перетаскивал мышь, чтобы получить текущую точку. В обоих случаях я перевожу точки в место на экране. Тогда разница между двумя точками будет легко вычислена, и местоположение может быть установлено соответствующим образом.

Мой класс общего назначения для этого класса Component Mover .

1 голос
/ 18 сентября 2010

Попробуйте это

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();
}
...