Применение цвета к прозрачной области изображения JButton, но не к его контейнеру

У меня есть круговой JButton, построенный с использованием круглого PNG-изображения с прозрачной областью.

Я хочу заполнить прозрачную область изображения JButton заданным цветом - но чем-то, кроме непрозрачного цвета фона JPanel, который содержит JButton. Я хочу сделать это программно на Java, а не предоставлять предварительно окрашенные изображения из графического пакета.

Я получил код ниже, который просто позволяет оранжевому фону непрозрачной панели окрашивать прозрачную область. Однако я не могу понять, как сохранить фон панели оранжевым, но залить прозрачность изображения, скажем, синим (или другим цветом для эффектов прокрутки и нажатия).

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");
    }
}

Я предполагаю, что мне может понадобиться применить преобразования Graphics2D к моему прозрачному изображению, чтобы создать набор из трех новых изображений (для нормального, опрокидывающегося и нажатого состояний моего JButton). Это подходящий путь вперед, и если да, можете ли вы предоставить мне пример кода для части, которую я пропускаю?

Спасибо

Ответы на вопрос(2)

Ваш ответ на вопрос