java JSwing -未修饰的窗口尽管被定义为透明,但仍不透明

sy5wg1nm  于 2023-06-28  发布在  Java
关注(0)|答案(1)|浏览(118)

我试图让this image出现在我的屏幕上,背景是透明的,作为一个更大的程序(作为一个虚拟宠物)的简单测试。
我使用下面的代码来做到这一点:

// Java Program to implement the shaped window
import javax.swing.*;
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
class solve extends JFrame {

    // main class
    public static void main(String[] args)
    {
        // try block
        try {

            // create a window
            JWindow w = new JWindow();

            // set a transparent  background of the window
            w.setBackground(new Color(0, 0, 0, 0));

            // read the image
            BufferedImage i = ImageIO.read(new File("froge.png"));

            // create a panel
            JPanel p = new JPanel() {

                // paint the panel
                public void paintComponent(Graphics g)
                {
                    // extract the pixel of the image
                    for (int ii = 1; ii < i.getHeight(); ii++)
                        for (int j = 1; j < i.getWidth(); j++) {
                            // get the color of pixel
                            Color ty = new Color(i.getRGB(j, ii));

                            // if the color is more than 78 % white ignore it keep it transparent
                            if (ty.getRed() > 200 && ty.getGreen() > 200 && ty.getBlue() > 200)
                                g.setColor(new Color(0, 0, 0, 0));
                                // else set  the color
                            else
                                g.setColor(new Color(i.getRGB(j, ii)));

                            // draw a pixel using a line.
                            g.drawLine(j, ii, j, ii);
                        }
                }
            };

            // add panel
            w.add(p);

            // set the location
            w.setLocation(350, 300);

            // set the size of the window
            w.setSize(1120, 320);

            // set the visibility of the window
            w.setVisible(true);
        }
        // catch any exception
        catch (Exception e) {

            // show the error
            System.err.println(e.getMessage());
        }
    }
}

这段代码几乎是从一篇极客文章中复制和粘贴的,该文章声称可以实现与我尝试的相同的东西。对我来说,代码检查出来了,但当我运行它时,我面对的是一个black background on my image

3bygqnnd

3bygqnnd1#

几件事:

  • 您的面板不应是不透明的(默认设置),因此p.setOpaque(false);
  • 您的窗口应该是未修饰的JFrame,因此JFrame w = new JFrame();w.setUndecorated(true);
  • 因为它是未修饰的,所以需要一种退出应用程序的方法。我建议在Escape键上设置一个键监听器。
  • 如果仍然不起作用,还可以在JFrame#getContentPane()JFrame#getRootPane()上调用setOpaque(false)

根据操作系统的不同,可能会有不同的行为。我的经验表明Linux不喜欢透明窗口上的动画,最近有一个针对Mac OS的bug修复,我不知道它是否已经发布。

相关问题