【问题标题】:JDialogs with translucency disappear when the main window is minimized当主窗口最小化时,具有半透明的 JDialogs 消失
【发布时间】:2012-09-25 18:52:38
【问题描述】:

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,但在它修复之前我真的可以使用更好的解决方法。

我的问题:

是否有人对防止这种情况发生的解决方法有任何想法?

趣闻:

  • 如果半透明窗口恰好是模态的,这会导致很大的问题。
  • 我关注的是每像素半透明度,但同样适用于均匀半透明度。
  • JFrame、浏览器中的 Applet 以及 Applet 查看器中的 Applet 都会出现此问题。

【问题讨论】:

    标签: java swing java-7 windowlistener translucency


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢!这为我省去了很多麻烦。我个人是这样做的: public void windowIconified(WindowEvent e) { instance.setBackground(Color.white); } public void windowActivated(WindowEvent e) { instance.setBackground(new Color(0, 0, 0, 0));现在它只会在最小化时变得不透明,而不是在另一个应用程序获得焦点时。
    猜你喜欢
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 2011-10-12
    • 2012-05-18
    • 2015-05-02
    • 1970-01-01
    相关资源
    最近更新 更多