阻止JPanel重绘repaint()调用的背景

时间:2016-11-18 18:38:37

标签: java swing jpanel

某些动画(例如某些gif文件)仅在每个帧中存储从前一帧更改的像素。要正确绘制这些动画,您必须绘制第一帧,然后在它们之上绘制后续帧而不删除前一帧。但是,当你调用repaint()时,JPanels总是重绘背景,删除前面的帧。有没有办法阻止JPanel重绘背景?我被告知在JPanels super.paintComponent(g)方法中调用paintComponent(Graphics g)是重绘背景的,但我尝试将其评论出来并导致一些奇怪的行为,所以我假设它不仅仅是只是重绘背景。

2 个答案:

答案 0 :(得分:3)

我建议您根据API提供的已存在代码构建代码,而不是弄乱它。只需将图像存储为BufferedImage即可。这允许您使用ImageIcon显示它,因此这是一个额外的简化。这允许您使用API​​更新单个像素而不会有任何麻烦。如果您绝对坚持将JPanel排除在重绘例程之外,this question可能会有所帮助。

一般来说:
遵循API的传统使用。如果您想永久存储图片数据,请{1 {1}}。每次更新帧时都应该完全覆盖BufferedImage

答案 1 :(得分:1)

根据您的具体要求,有两种常用方法:

  1. 在BufferedImage上绘图,然后显示BufferedImage
  2. 每次调用paintComponent()时,保留要绘制的对象的ArrayList并绘制列表中的所有对象。
  3. 查看Custom Painting Approaches以获取有关每种方法的更多信息和工作示例。