Farbe auf den transparenten Bereich eines JButton-Bildes anwenden - aber nicht auf den seines Containers

Ich habe einen kreisförmigen JButton, der aus einem kreisförmigen PNG-Bild mit einer transparenten Fläche erstellt wurde.

Ich möchte den transparenten Bereich des JButton-Bilds mit einer bestimmten Farbe füllen - aber etwas anderes als die undurchsichtige Hintergrundfarbe des JPanel, das den JButton enthält. Ich möchte dies programmgesteuert in Java ausführen, anstatt vorgefärbte Bilder aus einem Grafikpaket bereitzustellen.

Ich habe den folgenden Code erreicht, mit dem der orangefarbene Hintergrund des undurchsichtigen Bedienfelds den transparenten Bereich einfärbt. Ich kann jedoch nicht herausfinden, wie der Panel-Hintergrund orange bleibt, aber die Bildtransparenz beispielsweise mit Blau (oder einer anderen Farbe für Rollover- und gedrückte Effekte) gefüllt wird.

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

Ich schätze, ich muss möglicherweise Graphics2D-Transformationen auf mein transparentes Bild anwenden, um einen Satz von drei neuen Bildern zu erstellen (für den normalen Status, den Rollover-Status und den gedrückten Status meines JButton). Ist dies der richtige Weg und wenn ja, können Sie mir ein Codebeispiel für das Bit geben, das mir fehlt?

Vielen Dan

Antworten auf die Frage(4)

Ihre Antwort auf die Frage