java - 为什么重绘时透明窗口闪烁
问题描述
我正在尝试以与此答案相同的方式制作一个抗锯齿形状的窗口(圆形),但是这个问题遇到了同样的问题:重新绘制时,一旦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
}
}
我尝试了什么:
- JWindow 代替 JFrame
- JComponent 代替 JPanel
- 不透明的 JPanel(闪烁停止但透明像素累积直到接近不透明)
- 单/双缓冲
- 带/不带 alwaysOnTop
- 默认情况下,系统和 Nimbus LAF
- 使用 Bufferstrategy 而不是paintComponent:框架不再透明,但我可能不知道自己在做什么。
解决方案
推荐阅读
- c++ - 模拟读/写函数并接收冗余重新声明的警告
- html - 重叠的圆圈
- php - 如何输出符合 PHP 文本语句的 LaTeX 代码
- android - 将 gRPC 用于 Android 应用程序 - 示例应用程序
- html - 使用局部视图从视图生成 HTML 文件
- javascript - Jitsi meet external api 如何正确配置仅音频和自动加入?
- shell - 如何删除shell中匹配的行和前两行?
- apache-spark - 在条件内计算 MAX 值时出错
- node.js - Kubernetes - AKS:将 AKS 群集与应用程序网关链接。多个站点(不是子页面)指向同一个 IP
- java - Java SocketException:套接字已关闭