Aplicar color al área transparente de una imagen JButton, pero no la de su contenedor

Tengo un JButton circular construido usando una imagen PNG circular con un área transparente.

Quiero llenar el área transparente de la imagen JButton con un color dado, pero con algo más que el color de fondo opaco del JPanel que contiene el JButton. Quiero hacer esto mediante programación en Java en lugar de proporcionar imágenes pre-coloreadas de un paquete de gráficos.

Llegué hasta el siguiente código, que simplemente permite que el fondo naranja del panel opaco coloree el área transparente. Sin embargo, no puedo entender cómo mantener el fondo del panel como naranja, pero llenar la transparencia de la imagen con, digamos, azul (u otro color para el rollover y los efectos presionados).

import java.awt.Color;
import java.awt.Cursor;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.DefaultButtonModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class App extends JFrame implements ActionListener
{
    public App()
    {
       super();
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       setContentPane(makeContentPane());
    }

    private final JPanel makeContentPane()
    {
        JPanel contentPane = new JPanel();
        BufferedImage bi = null;
        try
        {
            bi = ImageIO.read(new URL("http://features.advisorwebsites.com/sites/default/files/users/AdvisorWebsitesFeatures/icones/1384148625_twitter_circle_gray.png"));
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        ImageIcon icon = new ImageIcon(bi);
        MyButton myButton = new MyButton(icon);
        myButton.addActionListener(this);
        contentPane.add(myButton);
        contentPane.setBackground(Color.ORANGE);
        contentPane.setOpaque(true);
        return contentPane;
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                App app = new App();
                app.pack();
                app.setVisible(true);
            }
        });
    }

    class MyButton extends JButton
    {
        public MyButton(ImageIcon icon)
        {
            super(icon);
            setMargin(new Insets(0, 0, 0, 0));
            setFocusable(false);
            setContentAreaFilled(false);
            setBorderPainted(false);
            setModel(new DefaultButtonModel());
            setCursor(new Cursor(Cursor.HAND_CURSOR));
        }
    }

    @Override
    public void actionPerformed(ActionEvent arg0)
    {
        System.out.println("You clicked me");
    }
}

Supongo que podría necesitar aplicar transformaciones Graphics2D a mi imagen transparente para crear un conjunto de tres nuevas imágenes (para los estados normales, rollover y presionado de mi JButton). ¿Es este el camino apropiado hacia adelante y, si es así, me puede proporcionar un ejemplo de código para el bit que me falta?

Gracias

Respuestas a la pregunta(2)

Su respuesta a la pregunta