首页 > 解决方案 > 为什么重绘时透明窗口闪烁

问题描述

我正在尝试以与此答案相同的方式制作一个抗锯齿形状的窗口(圆形),但是这个问题遇到了同样的问题:重新绘制时,一旦paintComponent被调用,窗口就会消失,然后重新出现通话返回。

我不知道这是否与我的特定机器有关,或者我在 Xorg 而不是 Wayland 或 OpenJDK 而不是 Oracle 中运行 Ubuntu 而不是 Windows 的事实。在所有这些项目都与我的工作 PC 不同的另一台计算机上,不会发生此问题。

重绘时闪烁的透明窗口

最小示例:

import java.awt.*;
import java.util.concurrent.*;
import javax.swing.*;

public class AntialiasedWindow extends JPanel {
    public static void main(String... args) {
        SwingUtilities.invokeLater(() -> {
            JFrame f = new JFrame();
            f.setUndecorated(true);
            f.setBackground(new Color(0, 0, 0, 0));
            f.setContentPane(new AntialiasedWindow());
            f.pack();
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        });
    }

    public AntialiasedWindow() {
        super(null);
        setOpaque(false);
        setPreferredSize(new Dimension(256, 256));

        new Timer(250, e->repaint()).start();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        ((Graphics2D)g).setRenderingHints(new RenderingHints(
                RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON));

        g.setColor(Color.DARK_GRAY);
        g.clearRect(0, 0, getWidth(), getHeight());
        g.fillArc(0, 0, getWidth(), getHeight(), 85, 270);

        //try { Thread.sleep(100); } catch (InterruptedException ignored) { }  // Flickering gets worse with this
    }
}

我尝试了什么:

标签: javaswingtransparencyantialiasingshaped-window

解决方案


推荐阅读