Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在重新绘制时停止清除Java画布_Java_Canvas_Awt_Repaint_Vlcj - Fatal编程技术网

在重新绘制时停止清除Java画布

在重新绘制时停止清除Java画布,java,canvas,awt,repaint,vlcj,Java,Canvas,Awt,Repaint,Vlcj,下面的代码只是在一个窗口中打开一个画布,它的内容中只填充了红色。但是,当调整窗口大小时,它会闪烁很多,因为在每次重新绘制之前,画布似乎会自行清除。经过一点琐碎的搜索,似乎是因为update()方法调用了g.clearRect(),但我现在已经覆盖了它,闪烁仍然存在,画布在重新绘制之前仍在清除自身 我一直在玩双缓冲,据我所知,这似乎并不能解决问题-我不确定这会有多大帮助,因为问题似乎更多的是防止画布在重新绘制之前清除 在每个人都冲进来提出建议之前,我必须在本例中使用画布,而不是JPanel,因为在

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

我一直在玩双缓冲,据我所知,这似乎并不能解决问题-我不确定这会有多大帮助,因为问题似乎更多的是防止画布在重新绘制之前清除

在每个人都冲进来提出建议之前,我必须在本例中使用画布,而不是JPanel,因为在不同的时间点,我使用相同的画布播放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);
    }
}

正如预期的那样,双缓冲并不是问题所在——无论哪种方式,画布都是在从AWT库内部深处的代码中绘制之前清除的

在对相关内部构件进行跟踪后,似乎“涂漆前清除”行为可以被以下属性覆盖:

System.setProperty("sun.awt.noerasebackground", "true");
添加以下内容可在重新绘制之前阻止画布上的背景被擦除,从而导致相关的闪烁


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

您是如何实现双缓冲的?我认为这不应该绘制白色矩形,因为您已经重写了导致它的方法。。。我已经在我的计算机上试用了该代码,效果很好。@zeller您是按原样还是不带双缓冲区试用了该代码?当我尝试时,我只是使用了一种简单的方法来交换图像,而不是使用内置的缓冲策略,但是没有任何改变。w/o双缓冲。它在闪烁,但不是因为画了白色的矩形。我认为你应该试试内置的缓冲策略,这里是一篇可能有帮助的帖子: