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();
以及:


你一定是个魔术师,我发誓我试过所有可能的组合。谢谢你,这完美地解决了我的问题。你一定是个魔术师,我可以发誓我尝试了所有可能的组合。谢谢,这完美地解决了我的问题。