Java 当窗口背景具有非零不透明度时,JComponent repaint()失败
这件事我已经坚持了一天了。我正在尝试动态更新我在透明无边框窗口顶部绘制的Java 当窗口背景具有非零不透明度时,JComponent repaint()失败,java,swing,transparent,repaint,jcomponent,Java,Swing,Transparent,Repaint,Jcomponent,这件事我已经坚持了一天了。我正在尝试动态更新我在透明无边框窗口顶部绘制的buffereImage。但是,当窗口背景alpha值设置为除full以外的任何值(1.0f)时,repaint()就会停止工作 我尝试了image\u canvas.setOpaque(false),但没有解决问题 请告诉我是否有人能找到一种解决方法,允许组件repaint()在透明背景上工作 复制问题的代码如下: import java.awt.Color; import java.awt.Graphics; impor
buffereImage
。但是,当窗口背景alpha值设置为除full以外的任何值(1.0f
)时,repaint()就会停止工作
我尝试了image\u canvas.setOpaque(false)
,但没有解决问题
请告诉我是否有人能找到一种解决方法,允许组件repaint()
在透明背景上工作
复制问题的代码如下:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Window;
import java.awt.image.BufferedImage;
import javax.swing.JComponent;
public class Dynamic_Buffered_Image2 {
static Window win;
static JComponent image_canvas;
static BufferedImage my_image;
public static void main(String[] args) throws InterruptedException {
// Create a test BufferedImage:
my_image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
for (int i = 0; i < 100; i++)
my_image.setRGB(i, i, Color.BLUE.getRGB());
// Create display window:
create_win();
// Modify the BufferedImage dynamically:
for (int i = 0; i < my_image.getWidth(); i++) {
for (int j = 0; j < my_image.getHeight(); j++) {
my_image.setRGB(i, j, Color.red.getRGB());
Thread.sleep(10);
win.repaint();
}
}
}
private static void create_win() {
win = new Window(null);
win.setSize(150, 150);
image_canvas = new JComponent() {
private static final long serialVersionUID = 1L;
protected void paintComponent(Graphics g) {
g.drawImage(my_image, 0, 0, null);
}
};
win.add(image_canvas);
win.setBackground(new Color(0, 0, 0, 1.0f)); // Any opacity other than 1.0f breaks repaint()??? (no red lines)
win.setVisible(true);
}
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.Window;
导入java.awt.image.buffereImage;
导入javax.swing.JComponent;
公共类动态缓冲映像2{
静态窗口赢;
静态JComponent图像_画布;
静态缓冲区映像我的_映像;
公共静态void main(字符串[]args)引发InterruptedException{
//创建测试缓冲区映像:
my_image=新的BuffereImage(100100,BuffereImage.TYPE_INT_RGB);
对于(int i=0;i<100;i++)
my_image.setRGB(i,i,Color.BLUE.getRGB());
//创建显示窗口:
创建_-win();
//动态修改BuffereImage:
对于(int i=0;i
}我做了两个更改:
//win.repaint();
image_canvas.repaint();
以及:
我做了两个改变:
//win.repaint();
image_canvas.repaint();
以及:
你一定是个魔术师,我发誓我试过所有可能的组合。谢谢你,这完美地解决了我的问题。你一定是个魔术师,我可以发誓我尝试了所有可能的组合。谢谢,这完美地解决了我的问题。