il codice è un po' sporco, ti posto la funzione che gestisce la pressione del mouse, nella quale prima di tutto si determina la posizione assoluta del mouse e attraverso queste coordinate il componente da draggare. Se questo esiste viene ritornata una struttura dati (la dragData) dove viene memorizzata una copia del componente da draggare. currentDataPoint contiene le coordinate relative al contenitore su cui si disegna. SIccome l'origine dell'immagine del componente da draggare è, normalmente, non coincidente con la posizione relativa del mouse devo correggere la posizione corrente traslandola della quantità dx, dy che dipende dalla posizione relativa del componente e delle dimensioni h e w dell'immagine.
E' a questo punto che ho dovuto correggerla ancora delle quantità 26 e 5, che corrispondono al bordo e all'altezza del titolo (comprensivo del bordo). I systemOut mi sono serviti solo per capire perchè avevo questa traslazione.
codice:
/* Gestisce la pressione del mouse estraendo i dati da trascinare */
private void handleMousePressed(MouseEvent e) {
Point screenPoint = convertPointToScreen(
e.getPoint(), e.getComponent());
dragData = ddUnit.carve(screenPoint);
if(dragData != null) {
setVisible(true);
currentDataPoint = convertPointFromScreen(screenPoint, this);
Component image = dragData.getData(Component.class);
Container c = this;
while ( c != null ) {
Insets insets = c.getInsets();
System.out.println("\ninsets.top:"+insets.top);
System.out.println("\ninsets.right:"+insets.right);
System.out.println("\ninsets.botton:"+insets.bottom);
System.out.println("\ninsets.left:"+insets.left);
c=c.getParent();
}
dx = e.getX() - image.getX() - 5 ;
dy = e.getY() - image.getY() - 26 ;
dragData.setOffset( dx, dy );
currentDataPoint.x -= dx ;
currentDataPoint.y -= dy ;
repaint();
/*
System.out.println("\npremuto in:"+e.getPoint().getX()+" - "+e.getPoint().getY());
Point location = e.getComponent().getLocationOnScreen();
System.out.println("\nComponente:"+location.x+" - "+location.y);
location = this.getLocationOnScreen();
System.out.println("\nPannello:"+location.x+" - "+location.y);
System.out.println("\nscreenPoint:"+screenPoint.x+" - "+screenPoint.y);
System.out.println("\ncurrentDataPoint:"+currentDataPoint.x+" - "+currentDataPoint.y);
if ( image != null )
System.out.println("\nimmagine:"+image.getX()+" - "+image.getY());
System.out.println("\ndelta:"+dx+" - "+dy);
*/
}
}