Arrastando

public class Arrastando extends MouseAdapter implements MouseMotionListener {  
     
       /** */  
       int baseX = -1;  
     
       /** */  
       int baseY = -1;  
     
       /** 
        * @see java.awt.event.MouseMotionListener#mouseDragged(java.awt.event.MouseEvent) 
        */  
       public void mouseDragged(MouseEvent e) {  
           Component b = e.getComponent();  
           if ((this.baseX != -1) && (this.baseY != -1)) {  
               int x = b.getX() + e.getX() - this.baseX;  
               int y = b.getY() + e.getY() - this.baseY;  
               b.setLocation(x, y);  
               b.getParent().repaint();  
           }  
       }  
     
       /** 
        * @see java.awt.event.MouseMotionListener#mouseMoved(java.awt.event.MouseEvent) 
        */  
       public void mouseMoved(MouseEvent e) {  
           //  
       }  
     
       /** 
        * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent) 
        */  
       public void mousePressed(MouseEvent e) {  
           this.baseX = e.getX();  
           this.baseY = e.getY();  
       }  
     
       /** 
        * @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent) 
        */  
       public void mouseReleased(MouseEvent e) {  
           this.baseX = -1;  
           this.baseY = -1;  
       }  
     
       /** 
        * @param args - 
        */  
       public static void main(String[] args) {  
     
           Random rand = new Random();  
     
           JFrame f = new JFrame("Teste");  
           f.setSize(640, 480);  
           Dimension windowSize = f.getSize();  
     
           Container contentPane = f.getContentPane();  
           contentPane.setLayout(null);  
     
           JComponent[] comp = new JComponent[10];  
           for (int i = 0; i < comp.length; i++) {  
               comp[i] = new JButton("Fly");  
               comp[i].setLocation(rand.nextInt(windowSize.width), rand.nextInt(windowSize.height));  
               comp[i].setSize(comp[i].getPreferredSize());  
     
               Arrastando mouseController = new Arrastando();  
               comp[i].addMouseListener(mouseController);  
               comp[i].addMouseMotionListener(mouseController);  
     
               contentPane.add(comp[i]);  
           }  
     
           f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
           f.setVisible(true);  
     
           f.getGlassPane().setVisible(true);  
       }  
     
   } 

Analizem meu codigo veja que compila e funciona 100%, abre o form com os icones e se eu clicar neles e arrastar eles vao tranquilamente, mas gostaria de implementar um outro estado neles, gostaria de que se eu segurar o click em um botao e arrastar pro lado e bater em algum otro botao, esse otro botao fosse pro lado tambem ex:
simulando uma situacao real de pegar algo, bater no componente e esse componente se mexer conforme vc bate no componente!
alguem ja passo por isso? qqr ajuda sera bem vinda !

Isso envolve duas coisas:
a) Testar a colisão, e verificar se ocorreu;
b) A física após a colisão.

Dependendo da precisão que você queira em a e b, esse seu problema será mais ou menos difícil.

Por exemplo, se um componente estiver sendo arrastado rapidamente, a “pancada” no outro deve ser mais forte? Como tratar as quinas? Ambos os componentes serão quadrados (outras formas podem modificar o teste de colisão)? A colisão no canto de um componente quadrado, fará ele girar?

Oi,

Pq não testar a proximidade do componente? Poderá ser “calculado” um raio/distancia minima para o outro componente se mover.
Então independente de forma, angulo, tamanho o componente será empurrado…

Tchauzin!