En una ocasión tuve que hacer una aplicación para crear diagramas en la que tenía que insertar componentes swing como JButton o JLabel dentro de un frame y que permitía arrastrarlos (drag) con el ratón por medio de la interfaz MouseMotionListener por toda la superfice del contenedor.
Básicamente consiste en crear unos objetos derivados de JButton o de JLabel, por ejemplo, e implementarles un MouseMotionListener. Mediante el método mouseDragged se registra la variación de coordenadas del puntero del ratón cuando se arrastra el componente y se actualiza su posición.
Es importante recordar que el panel o frame que contenga esos elementos debe tener un layout nulo y que dichos elementos deben tener unas coordenadas iniciales establecidas por el método setBounds.
Aquí va un sencillo código de ejemplo:
import javax.swing.*; import java.awt.*; import java.awt.event.*; public class DragTest { public static void main(String[] args) { MyWindow window = new MyWindow(); window.setVisible(true); window.setPreferredSize(new Dimension(400,400)); window.pack(); window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } class MyWindow extends JFrame{ public MyWindow(){ super("Drag test"); Container container = getContentPane(); container.setLayout(null); MyButton boton1 = new MyButton("Move me"); container.add(boton1); boton1.setBounds(10, 10, 100, 30); } } class MyButton extends JButton implements MouseMotionListener{ public MyButton(String text){ super.setText(text); addMouseMotionListener(this); } public void mouseDragged(MouseEvent mme) { setLocation( this.getX() + mme.getX() - this.getWidth() / 2, this.getY() + mme.getY() - this.getHeight() / 2 ); } public void mouseMoved(MouseEvent mme) {} }
Los comentarios están cerrados.