import javax.swing.*;
import java.awt.*;
import java.util.*;
import java.awt.event.*;


public class Clicker extends JComponent {
    private ArrayList<ActionListener> listeners;
    private String name;
    private final static int bufferSize = 4;
    
    public Clicker(String name) {
        this.name = name;
        listeners = new ArrayList<ActionListener>();
        addMouseListener(new Mouser());
        setBackground(Color.white);
    }
    
    protected void paintComponent(Graphics g) {
        g.setColor(getBackground());
        g.fillRect(0, 0, getWidth() - 1, getHeight() - 1);
        
        g.setColor(Color.black);
        g.drawRect(0, 0, getWidth() - 1, getHeight() - 1);
        
        FontMetrics fm = g.getFontMetrics();
        g.drawString(name, bufferSize / 2, fm.getAscent());
    }
    
    public Dimension getPreferredSize() {
        FontMetrics fm = getGraphics().getFontMetrics();
        int height = fm.getAscent() + fm.getDescent() + bufferSize;
        return new Dimension(fm.stringWidth(name) + bufferSize, height);
    }
    
    public void addActionListener(ActionListener al) {
        listeners.add(al);
    }
    
    private class Mouser extends MouseAdapter {
        public void mouseClicked(MouseEvent me) {
            ActionEvent ae = new ActionEvent(this, 0, "clicker clicked");
            for (ActionListener al: listeners) {
                al.actionPerformed(ae);
            }
        }
    }
}
