Very smooth. Yes yes me likes. I set the layout manager to null because contentpane uses BorderLayout as it's default layout manager. This enabled me to set dimensions of the button with out the layout manager getting in the way. Now i have plenty of space for the full drag action.
Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class MoveButton extends JFrame implements MouseListener, MouseMotionListener{

  Point location;
  MouseEvent pressed;
  JButton btn;

 public MoveButton(){
  btn = new JButton("Drag");
  btn.setBounds(new Rectangle(60,50,80,40));
//getContentPane().add(btn,BorderLayout.NORTH)
getContentPane().setLayout(null);
  getContentPane().add(btn);
  btn.addMouseMotionListener(this);
  btn.addMouseListener(this);
  setSize(400,400);
  setVisible(true);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 }

 public void mousePressed(MouseEvent e){
  pressed = e;
 }

 public void mouseClicked(MouseEvent e) {}
 public void mouseReleased(MouseEvent e) {}
 public void mouseDragged(MouseEvent e){

  location = btn.getLocation(location);
  int x = location.x - pressed.getX() + e.getX();
  int y = location.y - pressed.getY() + e.getY();
  btn.setLocation(x,y);
 }

 public void mouseMoved(MouseEvent e) {}
 public void mouseEntered(MouseEvent e) {}
 public void mouseExited(MouseEvent e) {}

  public static void main(String[] arguments){
   MoveButton b = new MoveButton();
  }
 }
I am interested in this piece of code though. Can you explain?
Code:
public void mouseDragged(MouseEvent e){
  location = btn.getLocation(location);
  int x = location.x - pressed.getX() + e.getX();
  int y = location.y - pressed.getY() + e.getY();
  btn.setLocation(x,y);
 }