Arrastrar (drag) componentes con el ratón (Java)

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) {}
}
Sin categoría

Deja una respuesta