JPopupMenu translúcido dentro de una ventana translúcida - ¿alternativa?

No estoy seguro de si esto es posible, pero ¿hay alguna manera de permitir que las ventanas emergentes sean translúcidas incluso cuando el contenedor principal también es translúcido?

Si no,¿Cuál sería una sabia alternativa para usar o extender en lugar deJPopupMenu?

Nota:Translúcido se refiere a un componente que no tiene 'fondo', similar al efecto desetOpaque(false);. Gracias.



Desde un foro respuesta por usuario.camickr en 2009:

No sé si la pintura de transparencia ha cambiado en 1.6.0_10. Antes de eso, creo que la transparencia solo se puede lograr en componentes ligeros (es decir, Swing hace todo el trabajo). JFrame, JWindow y JDialog no son ligeros porque usan componentes del sistema operativo.

En el caso de una ventana emergente, es liviana cuando está completamente contenida dentro de su marco principal. Pero una ventana emergente ligera no se puede pintar fuera de los límites del marco, por lo que se utiliza una ventana emergente (creo) como ventana emergente, que no puede ser transparente.

SSCCE: Mostrando JWindow translúcido sobre la parte superior de JFrame translúcido

<code>import com.sun.awt.AWTUtilities;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class OpaqueWindowSSCCE {

    private int countdown = 5;

    public static void main(String[] args) {
        new OpaqueWindowSSCCE();
    }

    public OpaqueWindowSSCCE() {
        final JFrame frame = new JFrame("OpaqueWindowSSCCE");
        final JWindow window = new JWindow();

        new Timer(1000, new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent e) {
                if(--countdown == 0){
                    frame.dispose();
                    window.dispose();
                    System.exit(0);
                } else {
                    frame.repaint();
                }
            }

        }).start();

        frame.setContentPane(new JPanel() {

            @Override
            public void paintComponent(Graphics paramGraphics) {
                super.paintComponent(paramGraphics);
                Graphics2D g = (Graphics2D) paramGraphics.create();
                g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                g.setColor(new Color(50, 50, 50));
                g.fillRoundRect(0, 0, getWidth(), getHeight(), 10, 10);
                g.setColor(new Color(180, 180, 180));
                g.drawString("Closing in " + countdown + " seconds", 20, 25);
            }
        });

        window.setContentPane(new JPanel() {

            @Override
            public void paintComponent(Graphics paramGraphics) {
                super.paintComponent(paramGraphics);
                Graphics2D g = (Graphics2D) paramGraphics.create();
                g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                g.setColor(new Color(180, 180, 180));
                g.fillRoundRect(0, 0, getWidth(), getHeight(), 10, 10);
            }
        });

        frame.setUndecorated(true);

        ((JComponent) frame.getContentPane()).setOpaque(false);
        ((JComponent) window.getContentPane()).setOpaque(false);

        AWTUtilities.setWindowOpaque(frame, false);
        AWTUtilities.setWindowOpaque(window, false);

        window.setAlwaysOnTop(true);

        frame.setBounds(200,200,500,500);
        window.setBounds(600,600,200,200);
        frame.setVisible(true);
        window.setVisible(true);
    }
}
</code>

Respuestas a la pregunta(1)

Su respuesta a la pregunta