Saturday, September 20, 2014

Making a window draggable in Java

In Java generally a frame has a border which gives the window the drag functionality. So, in custom windows, if we remove the border, we will lose the drag function.

We can enable that drag functionality using the MouseListener and MouseMotionListener interfaces of Java API. Following is and example code depicting the usage where NewJFrame is the class of the Java Frame:


class MoveMouseListener implements MouseListener, MouseMotionListener {
 NewJFrame target;
 Point start_drag;
 Point start_loc;

 public MoveMouseListener(NewJFrame target) {
  this.target = target;
 }

 public static JFrame getFrame(Container target) {
  if (target instanceof JFrame) {
    return (JFrame) target;
  }
  return getFrame(target.getParent());
 }

 Point getScreenLocation(MouseEvent e) {
  Point cursor = e.getPoint();
  Point target_location = this.target.getLocationOnScreen();
  return new Point((int) (target_location.getX() + cursor.getX()),
   (int) (target_location.getY() + cursor.getY()));
 }

 public void mouseClicked(MouseEvent e) {
 }

 public void mouseEntered(MouseEvent e) {
 }

 public void mouseExited(MouseEvent e) {
 }

 public void mousePressed(MouseEvent e) {
  this.start_drag = this.getScreenLocation(e);
  this.start_loc = this.getFrame(this.target).getLocation();
 }

 public void mouseReleased(MouseEvent e) {
 }

 public void mouseDragged(MouseEvent e) {
  Point current = this.getScreenLocation(e);
  Point offset = new Point((int) current.getX() - (int) start_drag.getX(),
   (int) current.getY() - (int) start_drag.getY());
  JFrame frame = this.getFrame(target);
  Point new_location = new Point(
   (int) (this.start_loc.getX() + offset.getX()), (int) (this.start_loc
    .getY() + offset.getY()));
  frame.setLocation(new_location);
 }

 public void mouseMoved(MouseEvent e) {
 }
}