import java.awt.*;
import java.awt.event.*;
import java.awt.event.ActionListener;

import javax.swing.*;


/**
 * @author Remi Forax
 *
 */
public class ClipGraphicsExample extends JComponent {

  protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    
    if (shape!=null)
      g.setClip(shape);
    
    g.drawImage(image, 120, 50, this);
    
    g.setColor(Color.RED);
    g.fillRect(12,12,150,150);
    
    g.setColor(Color.BLUE);
    g.fillOval(24, 24, 100, 100);
    
    g.setColor(Color.BLACK);
    g.drawLine(34,34,154,112);
    
    g.setFont(font);
    g.drawString("Example",12,32);
  }
  
  public void setShape(Shape shape) {
    if (!EventQueue.isDispatchThread())
      throw new IllegalStateException("not in dispatch thread");
    
    this.shape=shape;
    paintImmediately(0,0,getWidth(),getHeight());
  }
  
  private Shape shape;
  
  private final Font font=new Font("SansSerif",Font.BOLD,20);
  private final Image image=new ImageIcon("moon.jpg").getImage();

  public static void main(String[] args) {
    
    JFrame frame=new JFrame("GraphicsExample");
    final ClipGraphicsExample component=new ClipGraphicsExample();
    
    Shape[] clips=new Rectangle[] {
      null,
      new Rectangle(0,0,100,100),
      new Rectangle(100,0,100,100),
      new Rectangle(0,100,100,100),
      new Rectangle(100,100,100,100)
    };
    
    JPanel panel=new JPanel();
    ButtonGroup group=new ButtonGroup();
    
    for(int i=0;i<clips.length;i++) {
      final Shape shape=clips[i];
      JToggleButton button=new JToggleButton("clip "+i);
      button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
          component.setShape(shape);
        }
      });
      panel.add(button);
      group.add(button);
    }
    
    frame.getContentPane().add(component);
    frame.getContentPane().add(panel,BorderLayout.NORTH);
    frame.setSize(400,300);
    frame.show();
  }
}
