停止重绘时清除Java画布

时间:2012-05-21 10:05:59

标签: java canvas awt repaint vlcj

以下代码只是在一个窗口中显示一个画布,它只是用红色填充其内容。但是,当调整窗口大小时,它会闪烁很多,因为在每次重绘之前,画布看起来都会自行清除。经过一些微不足道的搜索后,似乎是因为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);
    }
}

1 个答案:

答案 0 :(得分:2)

双重缓冲,正如预期的那样,结果不是问题 - 无论哪种方式画布都被清除,然后从AWT库内部的代码中进行绘制。

在追踪相关的内部结构后,似乎可以通过属性覆盖“明确前画”行为:

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

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

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