Java 设置JFrame背景透明使弹出菜单为空

Java 设置JFrame背景透明使弹出菜单为空,java,swing,awt,jpopupmenu,translucency,Java,Swing,Awt,Jpopupmenu,Translucency,我的问题与类似,但我认为有一个更简单的例子 基本上,通过调用AWTUtilities.setWindowOpaque(window,false)使JFrame的背景透明,我的JPopupMenu有时显示为空白 public class JavaApplication8 { JPopupMenu popup; JMenuItem open; JLabel bgLabel = new JLabel("testing"); public static void ma

我的问题与类似,但我认为有一个更简单的例子

基本上,通过调用
AWTUtilities.setWindowOpaque(window,false)
使JFrame的背景透明,我的JPopupMenu有时显示为空白

public class JavaApplication8 {

    JPopupMenu popup;
    JMenuItem open;
    JLabel bgLabel = new JLabel("testing");

    public static void main(String[] args) {
        // TODO code application logic here

        JFrame window = new JFrame("test");

        URL bgURL = JavaApplication8.class.getResource("images/bg.jpg");
        ImageIcon bg = new ImageIcon(bgURL);

        JavaApplication8 test = new JavaApplication8();
        test.setPopupMenu();
        test.bgLabel.setIcon(bg);

        window.add(test.bgLabel, BorderLayout.CENTER);

        window.setUndecorated(true);
        AWTUtilities.setWindowOpaque(window, false);        
        //window.pack();
        window.setSize(200, 200);
        window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        window.setLocationRelativeTo(null);
        window.setVisible(true);

    }

    public void setPopupMenu(){
        popup = new JPopupMenu();
        open = new JMenuItem("Test");

        popup.add(open);
        this.bgLabel.setComponentPopupMenu(popup);     
    }

}
下面是正在发生的事情的图像:

有趣的是,每当我点击JFrame的右侧时,就会发生这种情况。不知道为什么。请记住,我不能100%确定
awutilities.setWindowOpaque(window,false)
确实是导致此问题的原因,但是每当我删除该行时,一切似乎都正常

编辑:如
camickr
所述,
在弹出菜单未完全包含在父窗口的边界中时,会发生这种情况。

每当我单击JFrame的右侧时,就会发生这种情况

当弹出菜单未完全包含在父窗口的边界中时,似乎会发生这种情况。不知道如何解决这个问题

在Java 7中,您可以使用:

frame.setBackground(new Color(0, 0, 0, 0));

透明度。

背景: 我不知道为什么使用透明/半透明背景会导致重量级弹出窗口以及它们的绘制方式出现问题,但事实确实如此——不管您是否使用
AWTUtilities.setwindow不透明(window,false)
frame.setBackground(新颜色(0,0,0,0))

当弹出窗口无法完全进入目标窗口时,将创建
HeavweightPopup
s。因此+User2280704如果单击窗口的最底部,您的问题也会出现<代码> ListWebPopupp S没有这个问题——因此,菜单在窗口的中间工作。 另外,值得注意的是,菜单通常会在第一次呈现良好效果,而不是在接下来的几次

回答: 我想出了一个解决办法,在任何弹出窗口显示后调用重新绘制。在启动应用程序时,只需调用以下代码

PopupFactory.setSharedInstance(new PopupFactory() 
{
    @Override
    public Popup getPopup(Component owner, final Component contents, int x, int y) throws IllegalArgumentException
    {
        Popup popup = super.getPopup(owner, contents, x, y);
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                contents.repaint();
            }
        });
        return popup;
    }
});

frame.setBackground(新颜色(0,0,0,0))之间有什么区别
AWTUtilities.setwindow不透明(window,false)?不幸的是,这并没有解决问题。是的,我只是测试了它。我发现弹出窗口的右侧显示为空,但如果在白色区域移动鼠标,则会显示文本。还是不知道为什么。区别在于,在JDK7中,透明度是API的一部分,您不需要使用不受支持的实用程序类。因此,假设代码实现得更好(尽管这个问题可能表明情况并非如此)。有一些重要的更改,所有内容都转到**,容器必须是未修饰的,L&F必须是SystemL&F,此时我建议不要在没有特殊原因或接受独特限制的情况下使用,有趣的是,你们可以为第二名改变一切。集装箱,在离开第一个集装箱的情况下。作为未被触动的…Java 6和Windows 7,没有问题,Java 7和Windows 7,没有问题…@MadProgrammer:真的吗?我使用的是Java 7和Windows 7,默认情况下,当它们完全包含在窗口中时,hmmm.jpopumenus是轻量级的。当弹出窗口的任何部分必须出现在窗口之外时,就会出现问题——然后会为弹出窗口创建一个新的沉重窗口。这个问题只出现在那个沉重的窗口中。我还是Java新手,所以我不知道“在启动应用程序时调用以下代码”是什么意思。要不要再详细说明一下?很抱歉给您添麻烦。没问题,只需将代码粘贴到某个地方,并确保它在您的第一个弹出窗口出现之前执行。你只需要打一次电话。所以,在最简单的情况下,您可以将它放在主方法中的任何位置。