Wie kann man ein transparentes Fenster mit opaken Buttons erzeugen? v.6.0

Ab Java 6 update 10 besteht die Möglichkeit, von java.awt.Window abgeleitete Komponenten transparent darzustellen. Die inoffizielle Klasse com.sun.awt.AWTUtilities stellt Methoden zur Verfügung, Fenster durchsichtig und/oder beschnitten darzustellen.

Das angeführte Code-Beispiel zeigt einen einfachen JFrame, auf den, in einer gängigen JPanel-Hierarchie, ein Bild und zwei JButton geladen werden. Die zwei einzigen für den hier genannten Zusammenhang interessanten Zeilen sind:

setUndecorated(true);
AWTUtilities.setWindowOpaque(this, false);

Die statische Methode setWindowOpaque() setzt durch Übergabe des Parameters false das Fenster auf eine durchsichtige Erscheinung. Der zweite, an erster Stelle stehende Parameter bezieht sich auf das betroffene Objekt. Es muss hierbei unbedingt beachtet werden, dass die Fensterleiste eines JFrame mit setUndecorated() entfernt wird.

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

import com.sun.awt.AWTUtilities;

public class TransparentesFenster extends JFrame implements ActionListener {

    private static final long serialVersionUID = 1L;

    private JButton newButt, exitButt;

    public TransparentesFenster() {
        super();
        setUndecorated(true);
        AWTUtilities.setWindowOpaque(this, false);
        JPanel contentPane = new JPanel();
        contentPane.setLayout(new BorderLayout());
        URL url = getClass().getClassLoader().getResource("test.png");
        ImageIcon icon = new ImageIcon(url);
        contentPane.add(new JLabel(icon, JLabel.CENTER), BorderLayout.CENTER);

        JPanel buttPanel = new JPanel(new FlowLayout());
        newButt = new JButton("Neu");
        newButt.addActionListener(this);
        buttPanel.add(newButt);
        exitButt = new JButton("Beenden");
        exitButt.addActionListener(this);
        buttPanel.add(exitButt);
        contentPane.add(buttPanel, BorderLayout.SOUTH);
        setContentPane(contentPane);
        this.pack();
        this.setAlwaysOnTop(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        this.setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == newButt) {
            System.out.println("Neu");
            setVisible(false);
            dispose();
        }
        if (e.getSource() == exitButt) {
            System.out.println("Beenden");
            System.exit(0);
        }
    }
    
    public static void main(String[] args) {
        new TransparentesFenster();
    }
}