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

¬Escrito por Ricardo F con 1 comentario
20 Sep 2006

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) {}
}

Tags:
Categorías: Programación

Hay 1 comentario. Deja el tuyo!

  • ¬ MK2
    #1740 13 November, 2006 a las 1:09 pm

    Gracias por éste artículo, me ha sido de gran interés!

Nombre (Obligatorio)

E-mail (Obligatorio)

Página web

Comentario

Meta

Secciones

Calendario

September 2006
M T W T F S S
« Aug   Oct »
 123
45678910
11121314151617
18192021222324
252627282930  

Categorias

Creative Commons License
This obra by Pablo Martínez is licensed under a Creative Commons Reconocimiento-Compartir bajo la misma licencia 3.0 España License.
Permissions beyond the scope of this license may be available at http://www.s3v-i.net/2008/11/24/cambios-en-el-tipo-de-licencia-creative-commons-de-dos-primos-luchan-contra-la-tecnologia/.