[英]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();
}
但不知何故,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.