gpt4 book ai didi

java - 阻止 Java Canvas 在重绘时清除

转载 作者:行者123 更新时间:2023-11-30 04:47:17 25 4
gpt4 key购买 nike

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

我已经尝试过双缓冲,据我所知,这似乎并不能解决问题 - 我不确定它会有多大帮助,因为问题似乎更多是为了防止重新绘制之前清除 Canvas 。

顺便说一句,在大家蜂拥而至并提出建议之前,我必须在本例中使用 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);
}
}

最佳答案

正如预期的那样,双缓冲并不是问题 - 不管怎样,在从似乎深藏于 AWT 库内部的代码进行绘制之前, Canvas 已被清除。

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

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

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

应该注意的是,这个属性显然是 Sun VM 特定的,因此不知道在另一个 VM 上是否会出现类似的行为。但它确实非常适合我的用例。

关于java - 阻止 Java Canvas 在重绘时清除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10683232/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com