【问题标题】:Stop Java canvas from clearing on repaint阻止 Java 画布在重绘时清除
【发布时间】:2012-05-27 20:01:31
【问题描述】:

下面的代码只是在一个窗口中打开了一个画布,它的内容只是用红色填充。但是,在调整窗口大小时,它会闪烁很多,因为在每次重新绘制之前,画布似乎都会自行清除。经过一些琐碎的搜索后,似乎是因为 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);
    }
}

【问题讨论】:

  • 你是如何实现双缓冲的?我认为这不应该绘制白色矩形,因为您已经覆盖了导致它的方法......我已经在我的计算机上尝试了代码并且效果很好。
  • @zeller 您是按原样尝试代码还是没有双缓冲?我只是在尝试时使用了一种简单的方法来交换图像而不是内置缓冲区策略,但没有任何变化。
  • 无双缓冲。它在闪烁,但这不是由于绘制了白色矩形。我认为你应该尝试内置的缓冲策略,这里有一个可能有帮助的帖子:stackoverflow.com/questions/5924697/java-double-buffering

标签: java canvas awt repaint vlcj


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    相关资源
    最近更新 更多