具有非透明内容的透明JFrame

时间:2018-11-26 01:28:35

标签: java swing jframe transparency

我的目标是拥有一个带有非透明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);
    }

}

当前,框架以白色背景呈现,并且正方形绘制正确。

enter image description here

但是,如果我将变量alpha的值更改为例如31,clearRect调用将仅清除具有31 alpha的面板,并且过去的帧仍然可见

enter image description here

左:1个迭代 右:4个迭代

如您所见,该框架将绘制4次,并且前一个实例仍然可见。

如何在不显示旧框架的情况下绘制透明框架?

我的操作系统是Ubuntu 18.04

1 个答案:

答案 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); 之类的方法。