import javax.swing.*;

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;

public class ImageDragger extends JPanel {
  public BufferedImage image;
  public Graphics panelGC;
  public int oldX;
  public int oldY;
  public boolean oldValid = false;
  
  public static void main(String[] args) {
    JFrame frame = new JFrame();
    ImageDragger dragger = new ImageDragger();
    frame.getContentPane().setLayout(new BorderLayout());
    frame.getContentPane().add(dragger, BorderLayout.CENTER);
    frame.setSize(500, 500);
    frame.setVisible(true);
  }
  
  public ImageDragger() {
    addMouseListener(new MousePresser());
    addMouseMotionListener(new MouseDragger());
  }
  
  public class MouseDragger extends MouseMotionAdapter {
    public void mouseDragged(MouseEvent e) {
      if (oldValid) {
        panelGC.drawImage(image, oldX, oldY, ImageDragger.this);
      }
      oldValid = true;
      oldX = e.getX();
      oldY = e.getY();
      panelGC.drawImage(image, oldX, oldY, ImageDragger.this);
    }
  
    public void mouseMoved(MouseEvent e) {
    }
  }
  
  public class MousePresser extends MouseAdapter {
    public void mousePressed(MouseEvent e) {
      image = new BufferedImage(getBounds().width/2, getBounds().height/2, BufferedImage.TYPE_BYTE_BINARY);
      Graphics2D gc = image.createGraphics();
      gc.draw(new Rectangle(0, 0, image.getWidth(), image.getHeight()));
      
      panelGC = getGraphics();
      panelGC.setXORMode(Color.white);
    }
    
    public void mouseReleased(MouseEvent e) {
      if (oldValid) {
        panelGC.drawImage(image, oldX, oldY, ImageDragger.this);
      }
      oldValid = false;
    }
  }
}