Durchscheinendes JPopupMenü in einem durchscheinenden Fenster - Alternative?

Ich bin nicht sicher, ob dies möglich ist, aber gibt es eine Möglichkeit, Popups sicher durchsichtig zu machen, auch wenn der übergeordnete Container ebenfalls durchsichtig ist?

Wenn nicht,Was wäre eine sinnvolle Alternative zu verwenden oder zu erweitern, anstattJPopupMenu?

Hinweis:Durchscheinend bezieht sich auf eine Komponente ohne "Hintergrund", ähnlich der Wirkung vonsetOpaque(false);. Vielen Dank.



Aus einem Forum Antwort von Benutzercamickr in 2009:

Ich weiß nicht, ob sich das Transparenz-Malen in 1.6.0_10 geändert hat. Davor glaube ich, dass Transparenz nur bei leichten Bauteilen erreicht werden kann (dh Swing macht den gesamten Anstrich). JFrame, JWindow und JDialog sind nicht leichtgewichtig, da sie Betriebssystemkomponenten verwenden.

Im Fall eines Popups ist es leicht, wenn es vollständig in seinem übergeordneten Frame enthalten ist. Ein leichtes Popup kann jedoch nicht außerhalb der Rahmengrenzen gezeichnet werden, sodass (wie ich glaube) ein JWindow als Popup verwendet wird, das nicht transparent sein kann.

SSCCE: Anzeigen von transluzentem JWindow über transluzentem 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>

Antworten auf die Frage(1)

Ihre Antwort auf die Frage