我的目标是拥有一个带有非透明JPanel的透明JFrame,该JPanel不断在随机位置绘制一个正方形
private static final int alpha = 255;
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 400);
frame.setLocationRelativeTo(null);
frame.setUndecorated(true);
frame.setBackground(new Color(255, 255, 255, alpha));
CustomPanel panel = new CustomPanel();
panel.setBackground(new Color(255, 255, 255, 0));
new Timer().schedule(new TimerTask() {
@Override
public void run() {
panel.revalidate();
panel.repaint();
}
}, 0, 1000);
frame.add(panel);
frame.setVisible(true);
}
public static class CustomPanel extends JPanel {
private static final long serialVersionUID = 1L;
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.clearRect(0, 0, getWidth(), getHeight());
g.setColor(new Color(0, 255, 0));
g.fillRect((int)(Math.random() * 380), (int)(Math.random() * 320), 20, 20);
}
}
当前,框架以白色背景呈现,并且正方形绘制正确。
但是,如果我将变量alpha
的值更改为例如31,clearRect调用将仅清除具有31 alpha的面板,并且过去的帧仍然可见
左:1个迭代 右:4个迭代
如您所见,该框架将绘制4次,并且前一个实例仍然可见。
如何在不显示旧框架的情况下绘制透明框架?
我的操作系统是Ubuntu 18.04
答案 0 :(得分:0)
对于透明面板,请不要使用透明颜色。 Swing无法正确绘制透明背景。有关更多信息,请参见Background With Transparency。
但是,要实现完全透明,有一个简单的解决方案。只需使面板透明即可:
$1
然后在绘画代码中使用:
//panel.setBackground(new Color(255, 255, 255, 0));
panel.setOpaque( false );
但是请注意,您不应在绘画方法中使用随机值。您无法控制Swing何时或多长时间重新绘制一个组件。
相反,您需要将该类的属性设置为矩形的颜色。然后,当您想更改正方形的颜色时,需要使用super.paintComponent(g);
g.setColor(new Color(0, 255, 0));
g.fillRect((int)(Math.random() * 380), (int)(Math.random() * 320), 20, 20);
之类的方法。