Java 添加组件后,JFrame将失去透明度特性

Java 添加组件后,JFrame将失去透明度特性,java,jframe,transparent,paintcomponent,Java,Jframe,Transparent,Paintcomponent,我想制作一个覆盖窗口,它有一个带有非透明子对象的透明框架。我成功地创建了透明窗口,甚至成功地添加了一个测试子项以查看它是否工作。但是一旦我用我的组件替换了测试代码。。。我的背景是白色的。有人知道为什么吗 package blahh; import javax.swing.*; import java.awt.*; import java.awt.event.*;; public class LoadingFrame { public static void main(String[

我想制作一个覆盖窗口,它有一个带有非透明子对象的透明框架。我成功地创建了透明窗口,甚至成功地添加了一个测试子项以查看它是否工作。但是一旦我用我的组件替换了测试代码。。。我的背景是白色的。有人知道为什么吗

package blahh;

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

public class LoadingFrame {

    public static void main(String[] args) {
        LoadingFrame Class = new LoadingFrame();
        Class.frameChar();


    }

    public void frameChar(){
        JFrame frame = new JFrame();
        B b = new B();


        frame.setUndecorated(true);
        frame.setBackground(new Color(0, 0, 0, 0));
        frame.setAlwaysOnTop(true);    
        frame.setPreferredSize(new Dimension(500, 500));
        frame.getContentPane().setLayout(new java.awt.BorderLayout()); 
        frame.setLocationRelativeTo(null);        
        frame.setVisible(true);
        //frame.getContentPane().add(new JLabel("test code");
        frame.add(b);
        frame.pack();
    }

 public class B extends JPanel{
     public void paintComponent(Graphics g){
            super.paintComponent(g);
            g.drawRect(0, 0, 100, 100);


        }

 }   
}

默认情况下,
JPanel
是不透明的,再加上
BorderLayout
,这将使其覆盖整个框架,使其看起来不透明。您需要对其调用
setOpaque(false)
,使其透明

    JFrame frame = new JFrame();
    B b = new B();
    b.setOpaque(false);


    frame.setUndecorated(true);
    frame.setBackground(new Color(0, 0, 0, 0));
    frame.setAlwaysOnTop(true);    
    // I'd prefer to override getPreferredSize of B
    frame.setPreferredSize(new Dimension(500, 500));
    frame.setLocationRelativeTo(null);        
    frame.add(b);
    frame.pack();
    frame.setVisible(true);

ps-您还应尽可能调用
setVisible
last,它只是减少了组件不随机出现的可能性

默认情况下,面板是不透明的,当您构建它时,请考虑调用
setOpaque(false)
!你是个天才。谢谢你的帮助!