添加组件后 JFrame 失去透明特性
JFrame loses transparency trait once components added
我想制作一个叠加层 window,它有一个带有非透明子项的透明框架。我在制作透明 window 时成功了,甚至在添加测试子项以查看它是否有效时也成功了。但是,一旦我用我的 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);
}
}
}
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
,它只是减少你的组件不随机出现的可能性
我想制作一个叠加层 window,它有一个带有非透明子项的透明框架。我在制作透明 window 时成功了,甚至在添加测试子项以查看它是否有效时也成功了。但是,一旦我用我的 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);
}
}
}
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
,它只是减少你的组件不随机出现的可能性