当主窗口最小化时,具有半透明度的JDialog消失

时间:2012-09-25 18:52:38

标签: java swing java-7 windowlistener translucency

Java 7中似乎存在window translucency functionality的错误(我相信Java 6中也存在问题)。如果我打开一个半透明的窗口然后最小化它的父窗口,两者都会像你期望的那样消失。但是当您恢复父窗口时,半透明窗口永远不会再出现。但是,它仍然存在,并且会消耗输入,好像没有错。

这是我的SSCCE:

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

public class BrokenTranslucentWindow extends JApplet //same problem exists using a JFrame
{
    public BrokenTranslucentWindow()
    {
        JButton b = new JButton("Hello");
        b.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                JDialog d = new JDialog(Window.getWindows()[0])
                {
                    @Override
                    public void paint(Graphics g)
                    {
                        g.fillOval(0, 0, getWidth(), getHeight());
                    }
                };
                d.setUndecorated(true);
                d.setBackground(new Color(0, 0, 0, 0));
                d.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
                d.setSize(300, 300);
                d.setLocationRelativeTo(null);
                // d.setModal(true);
                d.setVisible(true);
            }
        });
        this.add(b);
    }
}

您将注意到,在恢复父窗口后,半透明椭圆形窗口将不可见,但当您在窗口所在的区域上时,光标仍将更改为手形光标。

我已经提交了bug to Oracle,但在修复之前我真的可以使用更好的解决方法。

我的问题:

是否有任何想法可以防止这种情况发生?

有趣的事实:

  • 如果半透明窗口恰好是模态的,这会导致很大的问题。
  • 我专注于逐像素半透明,但同样适用于均匀半透明。
  • 此问题出现在JFrames,浏览器内的Applet和applet查看器中的Applet中。

1 个答案:

答案 0 :(得分:2)

我找到了一个不受欢迎的解决方法。我发布它希望它能获得一些创造性的果汁。解决方法是在停用窗口时关闭半透明效果,并在激活窗口时将其重新打开。

d.addWindowListener(new WindowAdapter()
{
    public void windowActivated(WindowEvent e)
    {
        d.setBackground(new Color(0, 0, 0, 0));
    }

    public void windowDeactivated(WindowEvent e)
    {
        d.setBackground(Color.white);
    }
});

这并不理想,因为当您点击窗口时它会变得不透明。但是, 会阻止窗口永远消失。