JPopupMenu translúcido dentro de uma janela translúcida - alternativa?

Não tenho certeza se isso é possível, mas existe uma maneira de permitir que os pop-ups sejam translúcidos mesmo quando o contêiner pai também é translúcido?

Se não,Qual seria a alternativa sábia para usar ou estender em vez deJPopupMenu?

Nota:Translúcido refere-se a um componente que não tem 'antecedentes', semelhante ao efeito desetOpaque(false);. Obrigado.



De uma resposta do fórum pelo usuáriocamickr em 2009:

Não sei se a transparência pintada mudou em 1.6.0_10. Antes disso, acredito que a transparência só pode ser alcançada em componentes leves (ou seja, Swing faz toda a pintura). JFrame, JWindow e JDialog não são leves porque usam componentes do sistema operacional.

No caso de um pop-up, ele é leve quando totalmente contido em seu quadro pai. Mas um popup leve não pode ser pintado fora dos limites do quadro, então um JWindow (eu acredito) é usado como o popup, que não pode ser transparente.

SSCCE: Mostrando JWindow translúcido sobre o topo do 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>

questionAnswers(1)

yourAnswerToTheQuestion