我想制作一个覆盖窗口,其中包含一个透明框架,其中包含非透明子框架。我在制作透明窗口时取得了成功,甚至在添加测试子项时成功,看它是否有效。但是只要我用paintComponent替换测试代码......我就会得到一个白色背景。谁知道为什么?
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);
}
}
}
答案 0 :(得分:2)
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
,这只会降低你的组件不会随机出现的可能性