1

下面的代码只是在一个窗口中打开了一个画布,它的内容只是用红色填充。但是,在调整窗口大小时,它会闪烁很多,因为在每次重新绘制之前,画布似乎都会自行清除。经过一些琐碎的搜索后,它似乎是因为update()调用的方法g.clearRect(),但我现在已经覆盖了它并且闪烁仍然存在,画布在重新绘制之前仍在清除自身。

我玩过双缓冲,据我所知,这似乎并不能解决问题 - 我不确定它有多大帮助,因为问题似乎更多的是阻止画布清除在重新粉刷之前。

顺便说一句,在每个人都冲进来提出建议之前,我必须在这种情况下使用 Canvas,而不是 JPanel,因为在不同的时间点,我使用相同的 Canvas 来播放 VLCJ 的原生视频。

public class MyCanvas extends Canvas {

    @Override
    public void update(Graphics g) {
        paint(g);
    }

    @Override
    public void paint(Graphics g) {
        //By the time we get here, the canvas has been cleared to its background colour
        g.setColor(Color.RED);
        g.fillRect(0, 0, getWidth(), getHeight());
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        MyCanvas c = new MyCanvas();
        frame.add(c);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}
4

1 回答 1

2

正如预期的那样,双缓冲结果不是问题 - 无论哪种方式,画布都在从似乎深入 AWT 库内部的代码进行绘制之前被清除。

在跟踪相关内部之后,似乎“绘制前清除”行为可以被属性覆盖:

System.setProperty("sun.awt.noerasebackground", "true");

添加以下内容会阻止背景在重新绘制之前在画布上被擦除,从而阻止相关的闪烁。

应该注意的是,这个属性显然是特定于 Sun VM 的,因此不知道您是否在另一个 VM 上获得了类似的行为。但是,它确实适用于我的用例。

于 2012-05-21T16:58:46.090 回答