Java 半透明窗口内的半透明JPOppMenu-可选?

Java 半透明窗口内的半透明JPOppMenu-可选?,java,swing,awt,translucency,Java,Swing,Awt,Translucency,我不确定这是否可行,但是否有一种方法可以安全地允许弹出窗口是半透明的,即使父容器也是半透明的 如果不是,使用或扩展什么替代jpopmenu? 注:半透明是指不“具有背景”的组件,类似于setOpaque(false)的效果。谢谢 从用户camickr在2009年的论坛回答: 我不知道透明度绘画是否在1.6.0_10中发生了变化。先前的 对此,我认为只有在轻量级的环境中才能实现透明度 组件(即Swing完成所有喷漆)。JFrame、JWindow和 JDialog不是轻量级的,因为它们使用操作

我不确定这是否可行,但是否有一种方法可以安全地允许弹出窗口是半透明的,即使父容器也是半透明的

如果不是,使用或扩展什么替代
jpopmenu

注:半透明是指不“具有背景”的组件,类似于
setOpaque(false)的效果。谢谢



从用户camickr在2009年的论坛回答:

我不知道透明度绘画是否在1.6.0_10中发生了变化。先前的 对此,我认为只有在轻量级的环境中才能实现透明度 组件(即Swing完成所有喷漆)。JFrame、JWindow和 JDialog不是轻量级的,因为它们使用操作系统组件

在弹出窗口的情况下,完全包含时是轻量级的 在其父帧内。但不能绘制轻量级弹出窗口 在框架的边界之外,因此JWindow(我相信)被用作 弹出窗口,不能是透明的

SSCCE:在半透明JFrame顶部显示半透明JWindow

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);
    }
}

试试这个代码部分,不过我用了
JWindow

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class WindowExample
{
    private JWindow window;
    private JLabel updateLabel;
    private int count = 5;
    private Timer timer;
    private int x;
    private int y;
    private ActionListener timerAction = new ActionListener()
    {
        public void actionPerformed(ActionEvent ae)
        {
            updateLabel.setText("Closing Window in " + count + " seconds...");
            count--;
            if (count == 0)
            {
                timer.stop();
                window.setVisible(false);
                window.dispose();
            }   
        }
    };

    private void createAndDisplayGUI()
    {
        final JFrame frame = new JFrame("Window Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setUndecorated(true);
        frame.setOpacity(0.5f);
        frame.addMouseListener(new MouseAdapter()
        {
            public void mouseClicked(MouseEvent me)
            {
                x = me.getX();
                y = me.getY();
                window = new JWindow();
                JPanel contentPane = new JPanel();
                JLabel positionLabel = new JLabel(
                    "X : " + me.getX() + " Y : " + me.getY());
                updateLabel = new JLabel("TImer");  
                contentPane.setLayout(new BorderLayout(5, 5));
                contentPane.add(updateLabel, BorderLayout.CENTER);
                contentPane.add(positionLabel, BorderLayout.PAGE_END);
                window.setContentPane(contentPane);
                window.setOpacity(0.5f);
                window.setSize(200, 100);
                window.setLocation(x + window.getWidth(), y + window.getHeight());
                window.setVisible(true);
                count = 5;
                timer = new Timer(1000, timerAction);
                timer.start();
            }
        });

        frame.setSize(500, 500);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new WindowExample().createAndDisplayGUI();
            }
        });
    }
}
以下是输出:

我收到警告

C:\Mine\JAVA\J2SE>javac -d classes src\OpaqueWindowSSCCE.java
src\OpaqueWindowSSCCE.java:1: warning: AWTUtilities is internal proprietary API and may be removed i
n a future release
import com.sun.awt.AWTUtilities;
                  ^
src\OpaqueWindowSSCCE.java:68: warning: AWTUtilities is internal proprietary API and may be removed
in a future release
        AWTUtilities.setWindowOpaque(frame, false);
        ^
src\OpaqueWindowSSCCE.java:69: warning: AWTUtilities is internal proprietary API and may be removed
in a future release
        AWTUtilities.setWindowOpaque(window, false);
        ^
3 warnings

我想,在给定的上下文中,使用
JWindow
这个函数可以实现这一点。感谢SSCCE!很明显,
JWindow
能够正确显示-缺点是我必须实现显示和隐藏,以模仿
jpopmenu
,这不会太难。非常欢迎您并保持微笑:-),是的,这是真的,即使在
jpopumenu
中,我想您也必须在其他地方单击以隐藏前面的:-),只是
JWindow
的优点是,我们可以添加任何我们想要添加的内容,以向用户显示:-)是的,但是
jpopumenu
可以很好地处理焦点,并且必须确保它工作正常。出于某种原因,我根本没有想到
JWindow
。。。谢谢,我会试一试,然后再回来找你DHmm这不起作用,因为设置任意的
不透明度在这里不是问题。我希望弹出窗口完全没有背景(这样圆角可以是圆形的)。需要注意的关键点是,
JFrame
不是不透明的,通过
awutilities.setWindowOpaque(frame,false)@paranoid android:很抱歉回复太晚,出现了一些服务器问题。请您提供一些小的工作代码,我可以尝试我的手,如果这不是一个大问题,它将是伟大的:-)