2010-09-18 17 views
3

J'ai un problème en essayant de faire glisser un JPanel. Si je mets en œuvre purement en mouseDragged comme:Glisser JPanel

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

Je reçois un effet bizarre de l'objet déplacé rebondissant entre deux positions tout le temps (générant plus « traînée » des événements). Si je le fais de la manière décrite dans this post, mais avec:

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

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

je reçois un effet de l'élément rebondissant beaucoup moins, mais il est encore visible et l'élément ne se déplace que la moitié de la façon dont le pointeur de la souris ne . Pourquoi cela arrive-t-il/comment puis-je résoudre cette situation?

Répondre

1

Essayez cette

final Component t = e.getComponent(); 
    e.translatePoint(getLocation().x + t.getLocation().x - px, getLocation().y + t.getLocation().y - py); 

et ajoutez cette méthode:

@Override 
public void mousePressed(final MouseEvent e) { 
    e.translatePoint(e.getComponent().getLocation().x, e.getComponent().getLocation().y); 
    px = e.getX(); 
    py = e.getY(); 
} 
+0

Avec cela, l'élément glissé saute dans le coin supérieur gauche de la fenêtre - mais le glissement est prévisible au moins ... – viraptor

+0

En fait - cela fonctionne sans la traduction dans mousePressed. Je ne sais toujours pas pourquoi. – viraptor

1

Je ne sais pas si vous pouvez le faire en utilisant un événement mouseDragged. Dans le passé, j'ai utilisé mousePressed pour enregistrer le point d'origine et la souris a été déplacée pour obtenir le point actuel. Dans les deux cas, je traduis les points à l'emplacement sur l'écran. Ensuite, la différence entre les deux points est facilement calculée et l'emplacement peut être réglé de manière appropriée.

Ma classe d'usage général est la classe Component Mover.

+0

Votre méthode (sauvegarde de la position sur l'écran) ne se casse-t-elle pas si le glissement fait défiler la zone de visualisation? – viraptor

+0

Doit admettre que je n'ai jamais essayé de faire glisser un composant dans un volet de défilement. – camickr

5

OK. La vieille question, mais si quelqu'un rencontre cela comme je l'ai fait, cela peut être résolu relativement simplement. Pour faire glisser un JPanel dans un JFrame je l'ai fait:

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

La clé est d'utiliser .getLocationOnScreen() et mettre à jour l'ajustement à la fin de chaque appel de mouseDragged.