Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Windows 10中是否不可能使用透明JFrame背景?_Java_Swing_Windows 10 - Fatal编程技术网

Java 在Windows 10中是否不可能使用透明JFrame背景?

Java 在Windows 10中是否不可能使用透明JFrame背景?,java,swing,windows-10,Java,Swing,Windows 10,我有一个未装饰的JFrame中的JPanel。我想给JPanel画一个图像。当图像包含透明像素时,我希望这些像素是“透明的”,以便您可以看到窗口后面的任何东西 我所有的研究都告诉我,我应该 myJFrame.setUndecorated(true); myJFrame.setBackground(new Color(0,0,0,0)); myJPanel.setOpaque(false); ,但只要我的JFrame的背景色的alpha不是255,我的JPanel就不再被吸引了。因此,根据我有限

我有一个未装饰的JFrame中的JPanel。我想给JPanel画一个图像。当图像包含透明像素时,我希望这些像素是“透明的”,以便您可以看到窗口后面的任何东西

我所有的研究都告诉我,我应该

myJFrame.setUndecorated(true);
myJFrame.setBackground(new Color(0,0,0,0));
myJPanel.setOpaque(false);

,但只要我的JFrame的背景色的alpha不是255,我的JPanel就不再被吸引了。

因此,根据我有限的测试,它在Windows 10上似乎运行良好

为了确定这一点,我使用
JLabel
做了一个测试

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                        ex.printStackTrace();
                    }

                    JFrame frame = new JFrame("Testing");
                    frame.setUndecorated(true);
                    frame.setBackground(new Color(0, 0, 0, 0));
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setContentPane(new TestPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() throws IOException {
            BufferedImage img = ImageIO.read(...);
            setOpaque(false);
            setBorder(new LineBorder(Color.RED));
            setLayout(new BorderLayout());
            add(new JLabel(new ImageIcon(img)));
        }

    }

}

这表明问题在代码中的某个地方,您没有向我们展示。考虑提供一个说明你的问题的方法。这不是一个代码转储,而是您正在做的一个示例,它突出了您所遇到的问题。这将减少混淆并获得更好的响应

不知道Windows 10,但您所描述的(在您描述的有限范围内)在Linux w/Java 8上适用于我。也许你可以把你的代码充实到一个新的版本?你不应该需要超过30行。@JohnBollinger我严格按照我在另一个问题的答案中找到的一个例子来做,突然它就起作用了。所以我想找出我是怎么做的,使它不起作用的。@JohnBollinger我想我发现了一些东西。显然,您不能直接绘制到JPanel(使用它的
getGraphics()
),但您可以覆盖
paintComponent()
,将图像绘制到JPanel,您可以将图像存储在扩展JPanel的类中,并更改该图像,然后调用
myJPanel.repaint()。是的,如果要在
JComponent
上执行自定义绘制,则应在其
paintComponent()
方法的范围内执行。作为此类工作的挂钩是该方法用途的一个重要方面。通过这种方式接收的
Graphics
已正确配置,而通过调用
getGraphics()
获得的图形可能未正确配置。你可以考虑在这些和其他重要的细节上提神;这里有一个很好的资源:。我可以问一下你从哪里得到这些很酷的图片吗?1+对于那些好的examples@JoFelix可能你做错了什么,我想在这种情况下没有必要调用
repaint()
。。。提供一个示例来说明这一点issue@JoFelix根据我的示例,除非在制作帧后更新图像,否则不会visible@Frakcool他们来自网络漫画megatokyo,你可以搜索异常的艺术more@JoFelix我不知道你想做什么,因为你没有解释你想实现什么以及你是如何实现的,所以我只能猜测,不要假设我们知道你在做什么。根据您试图执行的操作,您可能还需要调用revalidate,这是更新swing UI的常见做法,因此您的问题根本不在于使用透明窗口:P
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                        ex.printStackTrace();
                    }

                    JFrame frame = new JFrame("Testing");
                    frame.setUndecorated(true);
                    frame.setBackground(new Color(0, 0, 0, 0));
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setContentPane(new TestPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() throws IOException {
            BufferedImage img = ImageIO.read(...);
            setOpaque(false);
            setBorder(new LineBorder(Color.RED));
            setLayout(new BorderLayout());
            add(new JLabel(new ImageIcon(img)));
        }

    }

}