JComponent repaint () завершается ошибкой, когда фон окна имеет ненулевую непрозрачность - PullRequest
1 голос
/ 25 апреля 2020

Я застрял на этом в течение дня. Я пытаюсь динамически обновить BufferedImage, который я нарисовал поверх прозрачного окна без полей. Но repaint () перестает работать, как только для альфа-значения фона окна установлено значение, отличное от full (1.0f);

Я пробовал image_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);
}

}

1 Ответ

0 голосов
/ 25 апреля 2020

Я сделал два изменения:

//win.repaint();
image_canvas.repaint();

и:

image_canvas.setOpaque(true); // added
win.add(image_canvas);
...