Почему при перекрашивании мерцает прозрачное окно - PullRequest
1 голос
/ 01 мая 2020

Я пытаюсь сделать сглаженное окно в форме круга (круг) таким же образом, как этот ответ, но тот страдает от той же проблемы: при перерисовке, как только paintComponent вызывается, окно исчезает, чтобы вновь появиться после возврата вызова.

Я не знаю, связано ли это с моей конкретной машиной, или с тем, что я запускаю Ubuntu вместо Windows, в Xorg вместо Wayland или OpenJDK вместо Oracle. На другом компьютере, где все эти элементы отличаются от моей работы P C, эта проблема не возникает.

Transparent window which flickers on repaint

Минимальный пример:

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
  • С настройками по умолчанию, System и Nimbus LAF
  • С Bufferstrategy вместо paintComponent: рамка перестает быть прозрачной, но я, вероятно, не знаю, что я делаю.
...