透明背景JFrame Linux上的动画

Rol*_*and 9 java linux background transparent jframe

我想为Frame(或JFrame)创建一个完全透明的背景,并让它显示透明动画.我设法让它在Windows 7 x64中运行,但相同的代码不能在我的Linux上运行(Lubuntu x64 15.04).

下面的代码显示了我想要实现的目标 - 只需复制并粘贴即可.我只是希望小矩形在屏幕上移动而不留下痕迹.

static int  a   = 0;

public static void main(String[] args) {
    JFrame f = new JFrame();
    f.setUndecorated(true);
    f.setBackground(new Color(0, 0, 0, 0));
    f.setVisible(true);
    f.setSize(512, 512);
    f.add(new JPanel() {
        @Override
        public void paintComponent(Graphics gr) {
            Graphics2D g = (Graphics2D)gr;
            g.setBackground(new Color(0, 0, 0, 0));
            g.clearRect(0, 0, 512, 512);
            g.drawRect(a, a++, 2, 2);
        }
    });

    while(true) {
        try {
            Thread.sleep(30);
        } catch(InterruptedException e) {
            e.printStackTrace();
        }
        f.repaint();
    }
}
Run Code Online (Sandbox Code Playgroud)

我想要实现的目标(如Windows中所示)以及我使用Lubuntu 15.04获得的内容:

期望的动画          Lubuntu动画

我只想看到小方块移动就像在Windows 7上显示的那样 - 我不想看到一条小道.

请不要给我链接Oracle的透明度和窗口文档 - 我已经完成了三次.

我尝试过的:

  • Graphics2D的透明空间'copyArea()'.(这用于工作AFAIK但不再使用)
  • 玻璃板
  • 的AlphaComposite
  • setPaint()

请先测试一下你的想法/代码.很多"我应该工作"的东西我已经尝试过但似乎并不...所有的帮助都非常感谢.

Rol*_*and 3

基本上这个问题与操作系统有关。适用于 Windows 的方法不适用于 Linux,反之亦然。

由于某些原因,Linux 在设置 BufferStrategy 时仅允许动画每像素透明度。但是,此解决方案在 Windows 上失败。因此,我想出了以下代码,它根据操作系统选择正确的算法:

static int a = 0;

public static void main(String[] args) {
    JFrame f = new JFrame();
    JPanel p = new JPanel() {
        @Override
        public void paintComponent(Graphics g) {
            Graphics2D g2d = (Graphics2D) g;
            g2d.setBackground(new Color(255, 255, 255, 0));
            g2d.clearRect(0, 0, f.getWidth(), f.getHeight());
            g2d.drawRect(a, a++, 2, 2);
        }
    };
    f.add(p);
    f.setUndecorated(true);
    f.setBackground(new Color(255, 255, 255, 0));
    f.setSize(512, 512);
    f.setVisible(true);
    f.createBufferStrategy(2);

    BufferStrategy bs = f.getBufferStrategy();
    while (true) {
        try {
            Thread.sleep(33);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        if (System.getProperty("os.name").contains("indows ")) {
            p.repaint();
        } else {
            Graphics g = null;
            do {
                try {
                    g = bs.getDrawGraphics();
                    p.update(g);
                } finally {
                    g.dispose();
                }
                bs.show();
            } while (bs.contentsLost());
            Toolkit.getDefaultToolkit().sync();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

此代码适用于我的 Windows 7 x64 和 Lubuntu 15.04 x64。请亲自尝试此代码,看看它是否适合您。我自己没有 Mac,所以如果有人能为我测试一下,我将非常感激。如果它对任何人都不起作用,请告诉我。

这是你应该看到的:

在此输入图像描述