Pessoal,
Estou fazendo um trabalho de faculdade e nele preciso fazer com que seja possivel mover componentes em um container, arrastando e soltando. Tentei fazer da maneira abaixo mas não ficou muito bom o movimento do componente. Alguém sabe o que posso fazer para melhorar. Basta compilar e executar:
import java.awt.<em>;
import java.awt.event.</em>;
import javax.swing.*;
public class TestDragDrop extends JFrame
{
private MyComponent c;
private Label l1, l2;
private Panel p;
private int x,y;
public TestDragDrop()
{
this.setSize(605,405);
this.getContentPane().setLayout(null);
c = new MyComponent(Color.white);
c.addMouseMotionListener(new ComponentMotionAdapter());
c.setBounds(x,y,100,20);
p = new Panel();
p.setBackground(new Color(102,102,0));
p.setLayout(null);
p.setBounds(02,02,600,402);
p.add(c);
p.addMouseMotionListener(new ContainerMotionAdapter());
l1 = new Label("Localizacao do Mouse no container");
l1.setBounds(02,350,100,20);
p.add(l1);
l2 = new Label("Localizacao do Mouse no componente");
l1.setBounds(02,380,100,20);
p.add(l2);
this.getContentPane().add(p);
this.setVisible(true);
}
private class ContainerMotionAdapter extends MouseMotionAdapter
{
public void mouseMoved(final MouseEvent e)
{
l1.setText("Container: (" + e.getX() + "," + e.getY() + ")");
}
}
private class ComponentMotionAdapter extends MouseMotionAdapter
{
public void mouseDragged(MouseEvent e)
{
updateLocation(e);
}
public void mouseReleased(MouseEvent e)
{
//updateLocation(e);
}
void updateLocation(MouseEvent e)
{
c.setLocation(e.getX(),e.getY());
repaint();
}
public void mouseMoved(final MouseEvent e)
{
l2.setText("Component: (" + e.getX() + "," + e.getY() + ")");
}
public void redispatchEvent(final MouseEvent e)
{
final Component origin = e.getComponent();
e.setSource(origin.getParent());
e.translatePoint(origin.getX(), origin.getY());
origin.getParent().dispatchEvent(e);
}
}
public static void main(String[] args)
{
TestDragDrop ec = new TestDragDrop();
ec.show();
}
}
class MyComponent extends Component
{
MyComponent(final Color c)
{
setForeground©;
}
public void paint(final Graphics g)
{
g.setColor(getForeground());
g.fillRect(0, 0, getWidth(), getHeight());
}
public Dimension getPreferredSize()
{
return new Dimension(100, 50);
}
public boolean isOpaque()
{
return true;
}
}