繁体   English   中英

Java,Canvas下的透明JFrame

[英]Java, transparent JFrame under Canvas

我正在尝试实现一个带有Canvas对象的完全transperent JFrame 我试着通过调用frame.setBackground(new Color(0, 0, 0, 0));来使JFrame的背景透明frame.setBackground(new Color(0, 0, 0, 0)); 但不知何故, Canvas不会再出现在屏幕上,也不会绘制我的矩形。 但是,如果我注释掉setBackground函数它会完美绘制,但当然JFrame不透明。

    canvas.setPreferredSize(new Dimension(800, 800));

    frame = new JFrame(title);
    frame.setSize(1000, 1000);
    frame.setResizable(true);
    frame.setUndecorated(true);
    frame.add(canvas);
    //frame.setBackground(new Color(0, 0, 0, 0));
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    frame.toFront();

在Canvas上绘制蓝色矩形的缓冲策略。

public void render() {
    BufferStrategy bs = this.getBufferStrategy();
    if(bs == null){
        createBufferStrategy(3);
        return;
    }
    Graphics g = bs.getDrawGraphics();
    //////////////////////////////////////////////////
    g.setColor(Color.BLUE);
    g.fillRect(0,0,800,800);
    //////////////////////////////////////////////////
    g.dispose();
    bs.show();
}

当注释setBackground 图片 未注释setBackground 图像2

但不知何故,Canvas不会再出现在屏幕上,也不会绘制我的矩形

我怀疑你的代码还有更多内容,然后我们可以访问,因为我似乎能够让它工作......奇怪的是......

屏幕

所以,这基本上设置了一个半透明的窗口(为了测试,我测试了它的alpha为0并且它仍然可以工作),为它添加一个较小的Canvas (所以我可以看到窗口)并在顶部绘制甚至更小的矩形那个。

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferStrategy;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                TestPane pane = new TestPane();
                JFrame frame = new JFrame("Test");
                frame.setLayout(new GridBagLayout());
                frame.setSize(100, 100);
                frame.setResizable(true);
                frame.setUndecorated(true);
                frame.add(pane);
                frame.setBackground(new Color(255, 0, 0, 128));
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
                frame.toFront();

                Timer timer = new Timer(40, new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        pane.render();
                    }
                });
                timer.start();
            }
        });
    }

    public class TestPane extends Canvas {

        public void render() {
            BufferStrategy bs = this.getBufferStrategy();
            if (bs == null) {
                createBufferStrategy(3);
                return;
            }
            Graphics g = bs.getDrawGraphics();
            //////////////////////////////////////////////////
            g.setColor(Color.BLUE);
            g.fillRect(0, 0, 25, 25);
            //////////////////////////////////////////////////
            g.dispose();
            bs.show();
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(50, 50);
        }

    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM