Półprzezroczyste menu JPopup wewnątrz przezroczystego okna - alternatywne?

Nie jestem pewien, czy jest to możliwe, ale czy istnieje sposób na bezpieczne przepuszczanie wyskakujących okienek, nawet jeśli kontener nadrzędny jest przezroczysty?

Jeśli nie,co byłoby mądrzejszą alternatywą do użycia lub rozszerzenia zamiastJPopupMenu?

Uwaga:Przeświecający odnosi się do komponentu, który nie ma „tła”, podobnie jak efektsetOpaque(false);. Dzięki.



Z odpowiedzi na forum użytkownikacamickr w 2009:

Nie wiem, czy obraz przezroczystości zmienił się w 1.6.0_10. Wcześniej uważam, że przezroczystość można osiągnąć tylko w lekkich komponentach (tj. Swing robi cały obraz). JFrame, JWindow i JDialog nie są lekkie, ponieważ używają komponentów systemu operacyjnego.

W przypadku wyskakującego okienka jest on lekki, gdy jest całkowicie zawarty w ramce nadrzędnej. Ale lekkie wyskakujące okienko nie może być pomalowane poza granicami ramki, więc JWindow (wierzę) jest używany jako wyskakujące okienko, które nie może być przezroczyste.

SSCCE: Wyświetlanie przezroczystego okna JWindow na górze przezroczystej ramki JFrame

<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