我正在尝试以与此答案相同的方式制作一个抗锯齿形状的窗口(圆形),但是这个问题遇到了同样的问题:重新绘制时,一旦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:框架不再透明,但我可能不知道自己在做什么。